获取最大行(列)

时间:2012-07-06 16:12:56

标签: mysql sql

每当我使用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。

5 个答案:

答案 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作为限制加入您的表格。