3

この関数を使用するたびにmax、他の値との接続がすべて失われるため、後で印刷される行は、maxを実行した列と相関しなくなります。

だから私のテーブルは:

user col1 col2 col3
1    1    2    3
1    3    4    5
2    2    3    1
3    1    1    3
3    2    4    6
4    5    1    5

だから私が走れば

select user, col1, col2, max(col3) as col3
from table
group by user
order by user;

私は得るだろう

user col1 col2 col3
1    1    2    5
2    2    3    1
3    1    1    6
4    5    1    5

したがって、col3の最大値は正しいですが、その値の正しい行を取得しません。

私が欲しいのは、列の最大値を取得し、ユーザーごとにその行を返すことです。同じユーザーIDを持っている場合でも、すべてのユーザーを返す必要がある最大値が複数ある場合。

4

5 に答える 5

4

他のデータベース(MS SQL Serverなど)では、間違った結果が得られるという理由だけで、集計値と非集計値を混在させることはできません。

したがって、最大値があったレコードから非集計値が必要な場合は、テーブルに対して再度結合します。

select x.user, y.col1, y.col2, x.col3
from (
  select user, max(col3) as col3
  from table
  group by user
) x
inner join table y on y.user = x.user and y.col3 = x.col3
order by x.user
于 2012-07-06T16:19:28.387 に答える
2

これはおかしなことに見えるかもしれませんが、あなたのために働くはずです

SELECT B.* FROM
(
    SELECT user,MAX(col3) col3
    FROM mytable GROUP BY user
) A
INNER JOIN mytable B
USING (user,col3) ORDER BY user,col3;

サンプルデータは次のとおりです。

mysql> DROP DATABASE IF EXISTS terry;
Query OK, 1 row affected (0.06 sec)

mysql> CREATE DATABASE terry;
Query OK, 1 row affected (0.00 sec)

mysql> USE terry
Database changed
mysql> CREATE TABLE mytable
    -> (user INT,col1 INT,col2 INT,col3 int,
    -> key (user,col3));
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO mytable VALUES
    -> (1,    1,    2,    3),(1,    3,    4,    5),
    -> (2,    2,    3,    1),(3,    1,    1,    3),
    -> (3,    2,    4,    6),(4,    5,    1,    5);
Query OK, 6 rows affected (0.07 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM mytable;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    1 |    1 |    3 |
|    3 |    2 |    4 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
6 rows in set (0.00 sec)

クエリの出力は次のとおりです。

mysql> SELECT B.* FROM
    -> (
    ->     SELECT user,MAX(col3) col3
    ->     FROM mytable GROUP BY user
    -> ) A
    -> INNER JOIN mytable B
    -> USING (user,col3) ORDER BY user,col3;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    2 |    4 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
4 rows in set (0.02 sec)

mysql>

提供したサンプルデータのすべてのユーザーに対して、col3の最大値は1回しか出現しないため、この出力は正しいでしょう。特定のユーザーの2つの行のcol3が最大値と同じである場合、両方が表示されます。

これを説明するために、user=3およびcol3=6の別の行を追加しましょう。

mysql> INSERT INTO mytable VALUES (3,8,9,6);
Query OK, 1 row affected (0.10 sec)

mysql> SELECT B.* FROM
    -> (
    ->     SELECT user,MAX(col3) col3
    ->     FROM mytable GROUP BY user
    -> ) A
    -> INNER JOIN mytable B
    -> USING (user,col3) ORDER BY user,col3;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    2 |    4 |    6 |
|    3 |    8 |    9 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
5 rows in set (0.00 sec)

mysql>

試してみる !!!

于 2012-07-06T16:28:19.670 に答える
1

col1とcol2は行を一意にするため、クエリから削除する必要があります。試す

SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user;
于 2012-07-06T16:17:30.783 に答える
1
select t1.user, t1.col1, t1.col2, t1.col3
from table1 t1
where not exists(select * from table1 t2
                 where t1.user = t2.user
                   and t1.col3 < t2.col3)

同じ(最大)col3値を持つ1人のユーザーに複数の行がある場合、このユーザーのこの値を持つすべての行が返されます。

于 2012-07-06T16:36:40.840 に答える
0

クエリでは、各行の最大値を選択し、それが列として選択されます。最大値を知り、それを制限として使用して、その値を持つ行を選択します。


maxfromが必要な場合は、次のcol3ように実行できます。

select t.user,
       t.col1,
       t.col2,
       t.col3
from tablename t
join (
      select max(col3) as 'maximum'
      from tablename
     ) aux on aux.maximum = t.col3

結合はの値をaux選択してから、制限としてを使用してテーブルと結合します。maxcol3col3

于 2012-07-06T16:18:50.840 に答える