2016-02-25 76 views
0

從我的表格中,我想選擇每個user_id組中具有相應cat_id的max喜歡。MySql:選擇每個組的最大值以及相應的值爲

DROP TABLE IF EXISTS likes; 
CREATE TABLE likes 
(
    user_id int, 
    likes int, 
    cat_id int 
); 

insert into likes(user_id, likes, cat_id) values 
(2, 5, 56), 
(2,6,61), 
(2,7,70), 
(3,10,56), 
(3,11,61), 
(3,9,70), 
(4,14,56), 
(4,15,61), 
(4,16,70); 

http://sqlfiddle.com/#!9/51869/1

預期的結果

user_id max(likes) cat_id 
     2   7  70 
     3   11  61 
     4   16  70 

但在編輯器中的結果是不同的。我究竟做錯了什麼?

+0

什麼是您預期的結果?請閱讀[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t這裏是[** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/),瞭解如何提高您的問題質量並獲得更好的答案。 –

+0

@JuanCarlosOropeza預期結果顯示在問題 – julie

+0

好吧,我認爲這是當前的結果...如果你閱讀鏈接,你應該總是包括在你的問題。當前和慾望輸出。所以我們不浪費時間去嘗試同樣的事情。 –

回答

1

SQL Fiddle Demo

SELECT likes.user_id, likes.likes, cat_id 
FROM likes 
JOIN (
     Select user_id, max(likes) mlike 
     from likes 
     group by user_id) T 
    on likes.user_id = T.user_id 
    and likes.likes = T.mlike 

輸出

| user_id | likes | cat_id | 
|---------|-------|--------| 
|  2 |  7 |  70 | 
|  3 | 11 |  61 | 
|  4 | 16 |  70 | 
+0

該查詢依賴於實現細節(http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html)。 MySQL不承諾從集合選擇的同一行讀取非聚合字段。我假設MAX()只讀一條記錄,如果它被索引,那麼你在那裏很安全。 – sba

+0

@sba你確定嗎?我知道mysql不是ANSI關於group by的。但只有一個字段'user_id'和im分組。所以這裏沒有任何非彙總字段 –

+0

對不起,我誤讀了。事實上,你完全避免了這個問題,很好的解決方案! – sba