MySQL选择性GROUP BY,使用最大值

时间:2014-01-29 08:16:22

标签: mysql sql

我有以下(简化)三个表:

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,然后只计算那些,当计算给定的szak时,将它们从id列表中删除,然后在后端一起构建数据?

感谢您的帮助 - 我在谷歌上搜索了2个小时,但到目前为止,我找不到任何解决方案,所以也许您可以帮助我。

1 个答案:

答案 0 :(得分: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;