これはおかしなことに見えるかもしれませんが、あなたのために働くはずです
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>
試してみる !!!