0

我有两张桌子。(MySQL 数据库)事件:

id | title | ...

活动参与:

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分句。当我使用时,WHERE我将始终在 count_members 中获得 1。

编辑:我的目标是获取特定用户参与的活动,我想知道有多少用户已经参与了这些活动。

例如,用户 id=6 参加一个 id=1 的活动。但是还有 3 个其他用户参与事件 id=1。所以我应该得到一个事件,并且在列 count_members 我应该得到4.

4

4 回答 4

0

您需要将 having 子句更改为 where 子句。have 子句不使用分组列或聚合,因此它正在执行“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 的事件,同时仍计算所有其他成员。

于 2012-06-21T16:15:08.663 回答
0

尝试从这个开始:

SELECT e.*
FROM event e 
INNER JOIN event_participate ep 
    ON e.id = ep.event_id AND ep.user_id = 6
于 2012-06-21T16:19:13.137 回答
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

于 2012-06-21T16:22:42.057 回答
0

我想查找指定用户参与的活动。

SELECT e.title 
FROM event e
  JOIN event_participate ep ON e.id = ep.event_id
WHERE
  ep.user_id = 6;

无需使用GROUP BY子句。您没有汇总任何数据。

于 2012-06-21T16:35:52.543 回答