Mysql有没有正常工作

时间:2012-06-21 16:12:28

标签: mysql sql having

我有两张桌子。 (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

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子句。您没有聚合任何数据。