3

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

4

5 回答 5

4

其他数据库(例如 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-06T16:19:28.387 回答
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>

试试看 !!!

于 2012-07-06T16:28:19.670 回答
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 值,则将返回该用户具有该值的所有行。

于 2012-07-06T16:36:40.840 回答
1

您需要从查询中消除 col1 和 col2,因为它们使行唯一。尝试

SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user;
于 2012-07-06T16:17:30.783 回答
0

在您的查询中,您为每一行选择最大值,并将其选为一列。您想知道最大值是多少,并将其用作选择具有该值的行的限制。


假设你想要maxfrom 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连接选择 的值maxcol3然后您使用col3作为限制的表连接。

于 2012-07-06T16:18:50.840 回答