我有三张桌子
现在一个事件可以有多个主机和多个主机,我正在尝试做的是返回所有事件并使用GROUP_CONCAT
和INNER JOIN
来组织和返回主机以及那些正在进行和邀请的主机一个JSON对象中的特定事件。
但是,当使用INNER JOIN
获取所有主机以及与事件具有相同事件ID的主机时,它将返回正在运行的所有条目和处于活动状态的主机。
我会得到类似于
的输出[
{
"id": "1",
"title": "First Event",
"going": "4",
"hosts": "856400344377860,4",
"invited": "1791375127753569",
"original_host": "4,856400344377860"
}
]
这是我的查询
SELECT ev.id,
ev.title,
GROUP_CONCAT(CASE WHEN go.active = 1 THEN go.user_id END ORDER BY go.user_id) AS going,
GROUP_CONCAT(DISTINCT h.host_id) AS hosts,
GROUP_CONCAT(CASE WHEN go.active = 2 THEN go.user_id END ORDER BY go.user_id) AS invited,
GROUP_CONCAT(CASE WHEN h.original = 1 THEN h.host_id END ORDER BY h.host_id) AS original_host
FROM events AS ev
INNER JOIN going AS go ON ev.id = go.event_id
INNER JOIN hosts AS h ON ev.id = h.event_id
WHERE ev.active = 1
AND h.active = 1
AND (go.active = 1 OR go.active = 2) GROUP BY ev.id
问题是用户号4是具有不同ID的不同事件的主持人。因此,他不应该出现在他没有主持的事件中。我错误地使用INNER JOIN
还是我错了?
请原谅任何可怕的查询或数据库设计,只需从此开始。
编辑:用户4有一个条目进入他们正在托管的同一事件。删除going
中的条目后,4不再显示第一个事件的任何字段,就像它应该的那样。这似乎解决了这个问题,但任何想法为什么它会返回如此意外的结果?