我有两张桌子。 (MySQL数据库) 事件:
id | title | ...
Event_participate:
event_id | user_id | confirmed
confirmed
是0/1列。我想找到指定用户参与的事件。我的SQL查询是:
SELECT *, COALESCE(SUM(ep.confirmed), 0) AS count_members
FROM event e
LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id
HAVING (
ep.user_id = 6
)
我必须使用clasule,因为我想扩展此查询。 我有5个事件的结果,但当我查询时:
SELECT *
FROM `event_participate`
WHERE `user_id` = 6
我有7条记录。怎么可能?
我编辑了第二个表的结构(event_participate) - 它可以帮助您理解我为什么要使用having
clausule。当我使用WHERE
时,我将始终在count_members中获得1。
编辑: 我的目标是获取特定用户参与的活动,并且我想知道有多少用户已经参与这些活动。
e.g。 user id = 6参与id = 1的一个事件。但是有3个其他用户参与事件id = 1。所以我应该得到一个事件,并且在列count_members中我应该得到4
。
答案 0 :(得分:0)
您需要将having子句更改为where子句。 having子句不使用group-by列或聚合,因此它正在执行“any(user_id)= 6”。
SELECT *
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id
WHERE ep.user_id = 6
GROUP BY ep.event_id
根据您的编辑,我认为您需要类似的内容:
SELECT ep.event_id, COALESCE(SUM(ep.confirmed), 0) AS count_members
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id
HAVING max(case when ep.user_id = 6 then 1 else 0 end) = 1
您尝试将人口限制为至少有一个user_id = 6的事件,同时仍然计算所有其他成员。
答案 1 :(得分:0)
尝试从这开始:
SELECT e.*
FROM event e
INNER JOIN event_participate ep
ON e.id = ep.event_id AND ep.user_id = 6
答案 2 :(得分:0)
另外,我尝试修复您的查询:
SELECT *
FROM event e
LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id, ep.user_id
HAVING (
ep.user_id = 6
)
请注意,此查询中的GROUP BY子句是多余的,HAVING可以替换为WHERE
答案 3 :(得分:0)
我想找到指定用户参与的活动。
SELECT e.title
FROM event e
JOIN event_participate ep ON e.id = ep.event_id
WHERE
ep.user_id = 6;
无需使用GROUP BY
子句。您没有聚合任何数据。