加入两个表并获取一个的计数,但所有结果都与另一个表的 ID 匹配

Join two tables and get count of one but all results matching ID on other

这听起来有点混乱,但实际上很简单。

我在一个 table 中存储事件(如派对)。

示例:

USERID EventName EVENTID
10 CoolEvent 0
10 MediocreEvent 1

另一个 table 存储了该派对的邀请。这些可以有不同的状态,例如“已接受”或“主持人”(或“已拒绝”等)。

示例:

EVENTID status
0 accepted
0 host
0 declined

基本上,我需要从一个 USERID 获取所有活动,但我也想知道有多少人接受了该活动或者是主持人。

所以如果我想找出 ID 为 10 的用户有哪些事件,结果应该是:

{EVENTID:0,事件名称:CoolEvent,计数(状态 == 已接受或主持人):2}

{EVENTID:1,事件名称:MediocreEvent,计数(状态 == 已接受或主持人):0}

总共有两个结果。

这必须在一个查询中发生。

你能帮我吗?

我试过了:

var sqlString = "SELECT a.name, a.venueAdresse, a.userID, a.tblEventID, a.venueCity, a.startTimeAndDateUnixTicks, a.displayStartTime, a.slots, a.eventPictureThumb, COUNT(b.status) \
FROM 10561_12865_tblEvents a \
RIGHT JOIN 10561_12865_tblInvites b ON (a.tblEventID = b.tblEventID) \
WHERE a.userID  = '" + userID + "'\
AND (b.status = 'accepted' OR b.status = 'host') \
ORDER BY createdUnixInt DESC \
LIMIT " + start + "," + count

但这只会 return 结果 ID 匹配且状态为已接受或主机,但我只想计算一个 table 的出现次数。所以基本上 AND 只是指计数 属性.

所以我有点卡在这里。

最简单的方法是使用相关子查询:

SELECT e.name, e.venueAdresse, e.userID, e.tblEventID, e.venueCity, e.startTimeAndDateUnixTicks, e.displayStartTime, e.slots, e.eventPictureThumb, 
       (
         SELECT COUNT(*) 
         FROM `10561_12865_tblInvites` i
         WHERE i.tblEventID = e.tblEventID AND (i.status = 'accepted' OR i.status = 'host')
       ) counter
FROM `10561_12865_tblEvents` e 
WHERE e.userID  = ? 
ORDER BY e.createdUnixInt DESC 
LIMIT ?

用您传递的参数替换 ? 占位符。

设置sql_mode = ( SELECT 替换 (@@sql_mode, 'ONLY_FULL_GROUP_BY', '') );

SELECT t.EventName、t.EVENTID、t.Status、计数(状态) FROM (SELECT e.EventName, e.EVENTID, i.Status FROM event_table e 左连接 invite_table i ON e.EVENTID = i.EVENTID) AS t 按 t.EVENTID、t.Status

分组