加入两个表并获取一个的计数,但所有结果都与另一个表的 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
分组
这听起来有点混乱,但实际上很简单。
我在一个 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
分组