首页 > 解决方案 > 加入两个表并获得一个的计数,但所有结果都匹配另一个上的 ID

问题描述

这听起来有点令人困惑,但实际上很容易。

在一张表中,我存储事件(如派对)。

例子:

用户身份 事件名称 事件ID
10 酷事件 0
10 平庸事件 1

另一张桌子储存了参加那个聚会的邀请。这些可以具有不同的状态,例如“接受”或“主机”(或“拒绝”等)。

例子:

事件ID 地位
0 公认
0 主持人
0 拒绝

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

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

{事件 ID:0,事件名称:CoolEvent,计数(状态 == 接受或主机):2}

{事件 ID: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

但这只会返回 ID 匹配且状态被接受或托管的结果,但我只想计算一张表中的出现次数。所以基本上 AND 只是指计数属性。

所以我有点卡在这里。

标签: mysqlsqlcountwhere-clausecorrelated-subquery

解决方案


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

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 ?

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


推荐阅读