这可能会看到疯狂,但它应该为你工作
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中只有一个最大值出现。如果给定用户的两行具有与最大值相同的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>
试试看!
我不确定你在问什么。您是否在为每一列寻找最大值(因此只打印出4行)或者您是否在寻找每个记录,并且col3是该用户的最大值(导致6行) – 2012-07-06 16:18:03
@Terry:如何选择col1,col2 '没有在组中使用它们 – 2012-07-06 16:18:39
@HolgerBrandt没有一个真的。我想为每个用户获取一行,但是如果一个用户对不同行具有相同的最大值,那么它应该输出所有这些值。 – 2012-07-06 16:23:56