每当我使用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。
答案 0 :(得分:4)
其他数据库(例如MS SQL Server)不允许您将aggergated值与非聚合值混合,只是因为您会得到错误的结果。
因此,如果您希望记录中出现最大值的非聚合值,请再次加入该表:
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
答案 1 :(得分: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只有一次出现最大值。如果给定用户的两行具有与最大值相同的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>
试一试!!!
答案 2 :(得分:1)
您需要从查询中删除col1和col2,因为它们使行唯一。试试
SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user;
答案 3 :(得分: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值,则将返回该用户具有此值的所有行。
答案 4 :(得分:0)
在您的查询中,您选择每行的最大值并选择为列。 您想知道什么是最大值,并使用它作为限制来选择具有该值的行。
假设你想要来自max
的{{1}},你可以这样做:
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
的{{1}}值,然后使用max
作为限制加入您的表格。