MYSQL返回记录事件的人数



https://i.stack.imgur.com/PommS.jpg

上图显示了我的第一个名为events的表。

https://i.stack.imgur.com/xSBKX.jpg

上表链接到事件表,用于检查用户是否记录了事件。我想在显示事件详细信息时获得每个事件记录的数量。我遇到的问题是,如果一个事件有0个日志,它将不会出现在输出中。

这是我使用的sql:

SELECT event.`eventid`,
event.`name`,
`eventtime`,
`location`,
`datecreated`,
`dateofevent`,
`categoryname`,
`description`,
Count(participantlogs.eventid)
FROM   event,
recreationalcategory,
participantlogs
WHERE  recreationalcategory.categoryid = event.categoryid
AND participantlogs.eventid = event.eventid
GROUP  BY event.eventid 

如有任何帮助,我们将不胜感激!

放弃传统的逗号语法进行联接操作,改用JOIN关键字,将联接谓词重新定位到ON子句。JOIN关键字可以修改为具有LEFTRIGHT关键字,以允许外部联接。

外部联接将返回不匹配的行;正是所描述的用例。

SELECT e.eventid
, e.name
, COUNT(p.eventid)
FROM event e
LEFT
JOIN recreationalcategory c
ON c.categoryid = e.categoryid
LEFT
JOIN participantlogs p
ON p.eventid = e.eventid
GROUP
BY e.eventid
, e.name

另一种选择是在SELECT列表中使用相关的子查询,而不是联接。假设eventidevent表中的PRIMARY KEY或UNIQUE KEY,我们可以删除GROUP BY子句。。。

SELECT e.eventid
, e.name
, ( SELECT COUNT(1)
FROM participantlogs p
WHERE p.eventid = e.eventid
) AS cnt
FROM event e
LEFT
JOIN recreationalcategory c
ON c.categoryid = e.categoryid

左联接应该可以完成您的工作。

SELECT event.`eventid`,
event.`name`,
`eventtime`,
`location`,
`datecreated`,
`dateofevent`,
`categoryname`,
`description`,
Count(participantlogs.eventid)
FROM   event,
recreationalcategory,
participantlogs
WHERE  (recreationalcategory.categoryid = event.categoryid OR recreationalcategory.categoryid  is null)
AND participantlogs.eventid = event.eventid
GROUP  BY event.eventid

关于简单使用left join

SELECT event.`eventid`,
event.`name`,
`eventtime`,
`location`,
`datecreated`,
`dateofevent`,
`categoryname`,
`description`,
Count(participantlogs.eventid)
FROM   event 
left join recreationalcategory 
on recreationalcategory.categoryid = event.categoryid
join participantlo on
on participantlogs.eventid = event.eventid
GROUP  BY event.eventid

最新更新