内部加入被忽略或使用不当?

时间:2015-04-04 00:02:46

标签: mysql inner-join

我有三张桌子

  1. events:包含事件ID和一些额外信息
  2. hosts:包含主机ID,事件ID,原始列和活动列
  3. going:包含用户ID,事件ID和跟踪状态的活动列
  4. 现在一个事件可以有多个主机和多个主机,我正在尝试做的是返回所有事件并使用GROUP_CONCATINNER 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不再显示第一个事件的任何字段,就像它应该的那样。这似乎解决了这个问题,但任何想法为什么它会返回如此意外的结果?

0 个答案:

没有答案