在MySQL中通过statment选择相应的非聚合列

时间:2017-01-27 03:40:29

标签: mysql sql aggregate-functions

我有一个临时表,我是从一个更大的表中派生出来的。

+-----+----------+---------+
| id  | phone    | attempt |
+-----+----------+---------+
|  1  | 12345678 |      15 |
|  2  | 87654321 |       0 |
|  4  | 12345678 |      16 |
|  5  | 12345678 |      14 |
|  10 | 87654321 |       1 |
|  11 | 87654321 |       2 |
+-----+----------+---------+

我需要找到与每个电话号码上最高尝试次数相对应的ID(唯一)。电话和尝试并不是唯一的。

SELECT id, MAX(attempt) FROM temp2 GROUP BY phone

上述查询不会返回相应最大尝试次数的ID。

2 个答案:

答案 0 :(得分:3)

试试这个:

select
    t.*
from temp2 t
inner join (
    select phone, max(attempt) attempt
    from temp2
    group by phone
) t2 on t.phone = t2.phone
and t.attempt = t2.attempt;

它将返回给定数字的最大尝试次数。

请注意,如果手机有多行,如果尝试次数与该手机的最大尝试次数相同,则会返回多个ID。

Demo here

答案 1 :(得分:2)

作为@GurV给出的答案的替代方法,您还可以使用相关子查询来解决此问题:

SELECT t1.*
FROM temp2 t1
WHERE t1.attempt = (SELECT MAX(t2.attempt) FROM temp2 t2 WHERE t2.phone = t1.phone)

这样做的好处是不那么冗长。但我可能会选择加入选项,因为它可以更好地扩展到大型数据集。

Demo