在MySQL中按状态分组后选择相应的非聚合列

在MySQL中按状态分组后选择相应的非聚合列,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一个临时表,是从一个大得多的表派生出来的 +-----+----------+---------+ | id | phone | attempt | +-----+----------+---------+ | 1 | 12345678 | 15 | | 2 | 87654321 | 0 | | 4 | 12345678 | 16 | | 5 | 12345678 | 14 | | 10 | 87654321 |

我有一个临时表,是从一个大得多的表派生出来的

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

请尝试以下操作:

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


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

SELECT t1.*
FROM temp2 t1
WHERE t1.attempt = (SELECT MAX(t2.attempt) FROM temp2 t2 WHERE t2.phone = t1.phone)
这样做的优点是不太冗长。但我可能会选择join选项,因为它可以更好地扩展大型数据集


显示错误1137 HY000:无法重新打开表:“t”。我之前也遇到过这个问题。原来是因为这是一张临时表。不要使用临时表,而是创建视图或其他表。以上和@Tim的解决方案就是解决这个问题的方法。@Tim-谢谢你的帮助:我开始创建另一个临时表。从temp2 t内部连接中选择t.*在t.phone=t2.phone和t.trunt=t2.trunt上通过电话t2从temp3组中选择msisdn、maxtrunt-trunt@普拉山-不错。我正要建议: