每当我使用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。
发布于 2012-07-07 00:19:28
其他数据库(例如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-07 00:28:20
这可能看起来很疯狂,但它应该对你有效
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>试一试吧!
发布于 2012-07-07 00:17:31
您需要从查询中删除col1和col2,因为它们使行是惟一的。试一试
SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user;https://stackoverflow.com/questions/11365937
复制相似问题