我有以下(简化的)三个表格:
用户预订:
id | user_id |
1 | 3 |
1 | 3 |
用户_kar:
id | user_id | szak_id |
1 | 3 | 1 |
2 | 3 | 2 |
萨克:
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)。我尝试了 MAX(k.id) 和 HAVING,但似乎没有效果。
我想知道MySQL中是否有支持的方法,或者我应该首先选择后端站点上的所有用户ID,检查它们的最大kar.user_id,然后仅对这些进行计数,当计算给定的 szak 时,将它们从 id 列表中删除,然后在后端将数据重新构建在一起?
感谢您的帮助 - 我在谷歌上搜索了大约 2 个小时,但到目前为止,我没有找到解决方案,所以也许您可以帮助我。
最佳答案
类似这样的吗?
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;
关于MySQL选择性GROUP BY,使用最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21425516/