2017-01-27 18 views
1

我有一张从更大的表派生的临时表。在MySQL中使用语句分组后选择相应的非聚合列

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

回答

1

试试这个:

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

+0

说ERROR 1137(HY000):不能重新打开表: 'T'。我也很早就遇到了这个问题。原来,这是因为这是临时表 – PrashanD

+0

[您不能多次访问临时表](http://stackoverflow.com/questions/343402/getting-around-mysql-cant-reopen-table-error)。请勿使用临时表,改为创建视图或其他表。上述和Tim的解决方案是解决这个问题的方法。 – GurV

+0

在这里,有一个[小提琴](http://sqlfiddle.com/#!9/71953/5)。 –

1

作为替代由@GurV给出的答案,你也可以解决这个使用相关子查询:

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

这具有少一点冗长的优势。但我可能会使用连接选项,因为它可以对大型数据集进行更好的扩展。

演示在这里:

SQLFiddle