2014-01-29 34 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

其实一些重构之后,它就像魅力 - 从来没有想过一个内部的选择可能是在这种情况下是有用的,但现在它现在似乎合理的选择我。 :) –