2014-01-29 35 views
0

我有以下(簡化的)三個表:MySQL的選擇性GROUP BY,使用最大值

user_reservations:

id | user_id | 
1 | 3  | 
1 | 3  | 

user_kar:

id | user_id | szak_id | 
1 | 3  | 1  | 
2 | 3  | 2  | 

szak:

id | name | 
1 | A | 
2 | B | 

現在我想數一下用'szak'這個名字保留用戶,但我希望每個用戶只能計算一個szak。在這種情況下,USER_ID有2個「szak」,如果我編寫一個查詢類似:

SELECT sz.name, COUNT(*) FROM user_reservations r 
    LEFT JOIN user_kar k ON k.user_id = r.user_id 
    LEFT JOIN szak s ON r.szak_id = r.id 

它將返回兩行:

A | 2 | 
B | 2 | 

但是我想算只有一個每預訂szak(可以說只有最高的ID)。我用HAVING試着MAX(k.id),但似乎不起作用。

我想知道在MySQL中是否有支持的方法,或者我應該先選擇後端站點上的所有用戶ID,然後檢查它們的最大值kar.user_id,然後只計算那些,將它們從id列表中刪除,計算給定的szak時,然後在後端一起構建數據?

感謝您的幫助 - 我在網上搜索了2個小時,但到目前爲止,我找不到解決方案,所以也許您可以幫助我。

回答

1

像這樣的東西?

SELECT sz.name, 
     Count(*) 
FROM (SELECT r.user_id, 
       Ifnull(Max(k.szak_id), -1) AS max_szak_id 
     FROM user_reservations r 
       LEFT OUTER JOIN user_kar k 
          ON k.user_id = r.user_id 
     GROUP BY r.user_id) t 
     LEFT OUTER JOIN szak sz 
        ON sz.id = t.max_szak_id 
GROUP BY sz.name; 
+0

其實一些重構之後,它就像魅力 - 從來沒有想過一個內部的選擇可能是在這種情況下是有用的,但現在它現在似乎合理的選擇我。 :) –