2017-01-27 47 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