2012-07-06 32 views
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的最大值是正确的,但它不” t获得该值的正确行。

我想要的是获取列的最大值并为每个用户返回该行。如果有多个最大值应该返回所有用户,即使它具有相同的用户标识。

+0

我不确定你在问什么。您是否在为每一列寻找最大值(因此只打印出4行)或者您是否在寻找每个记录,并且col3是该用户的最大值(导致6行) – 2012-07-06 16:18:03

+1

@Terry:如何选择col1,col2 '没有在组中使用它们 – 2012-07-06 16:18:39

+0

@HolgerBrandt没有一个真的。我想为每个用户获取一行,但是如果一个用户对不同行具有相同的最大值,那么它应该输出所有这些值。 – 2012-07-06 16:23:56

回答

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 
+0

我试着再次查询示例数据。它的作品,所以+1! – RolandoMySQLDBA 2012-07-06 17:01:57

+0

是的,非常好。我想知道,如果有可能通过'where'来避免'inner join'?我出于某种原因,不太喜欢'内部连接'。 – 2012-07-06 18:00:06

+0

@TerryUhlang:你可以在'where'中使用一个子查询,但是最终只会作为一个连接执行,所以这只是编写相同查询的一种不好的方式。 – Guffa 2012-07-06 18:55:27

1

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

SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user; 
+0

虽然你说的是正确的,但OP需要每行的所有列,所以你的解决方案是不正确的。 – 2012-07-06 16:25:47

0

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


假设你想从col3max,你可以做这样的:

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加入选择的col3max值,然后你使用col3作为限制你的表连接。

+0

我试着再次查询示例数据。它只返回col = 3; – RolandoMySQLDBA 2012-07-06 17:03:47

+0

它应该返回行 '3 2 4 6'是不是你想要的,最大的'col3'行? – 2012-07-06 21:38:16

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> 

试试看!

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值一个用户几行,然后用这个用户这个值的所有行会退还。

+0

我试着再次查询示例数据。它的作品,所以+1! – RolandoMySQLDBA 2012-07-06 17:00:36