【问题标题】:Left Join with conditional on Right Table在右表上有条件的左连接
【发布时间】:2013-09-13 02:27:38
【问题描述】:

我在为我的以下问题找出 sql 时遇到了麻烦。我有两个这样的表:

+----------+------------+------------+
| event_id | event_name | event_date |
+----------+------------+------------+

+---------------+----------+---------+--------+
| attendance_id | event_id | user_id | status |
+---------------+----------+---------+--------+

我想做的是得到一个这样的表:

+----------+--------+
| event_id | status |
+----------+--------+

第二个考勤表的条件是user_id。我正在尝试获取所有事件的列表以及每个事件的用户状态,即使没有出席记录(现在可以使用 NULL)。同样,考勤表中的状态数据需要由 user_id 选择。

根据我最初的研究,我认为这会奏效:

SELECT event_id, status FROM events LEFT JOIN attendance WHERE attendance.user_id='someoutsideinput' ORDER BY event_date ASC

但这并不像预期的那样对我有用..我应该怎么做?

谢谢!

【问题讨论】:

    标签: mysql sql database join left-join


    【解决方案1】:

    您需要做的就是将WHERE 子句中的条件移动到ON 子句中。

    SELECT events.event_id, COALESCE(attendance.status, 0) status
    FROM events LEFT JOIN attendance
         ON events.event_id = attendance.event_id AND
            attendance.user_id='someoutsideinput'
    ORDER BY events.event_date ASC
    

    【讨论】:

    • 谢谢!也只是想知道,有没有办法让我在返回 NULL 时用 0 替换 NULL?
    • 使用,COALESCE(),例如。 COALESCE(attendance.status, 0) status
    【解决方案2】:

    您需要在 JOIN 子句而不是 WHERE 子句中添加更多条件。

    顺便说一句,你没有指定表之间的连接条件,我也在下面更正了。

    SELECT E.event_id
            ,A.status 
    FROM    events E
    LEFT JOIN 
            attendance A
    ON      E.event_id = A.event_id
    AND     A.user_id='someoutsideinput' 
    ORDER BY 
            E.event_date ASC
    

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2015-10-28
      • 2020-07-28
      • 2017-08-15
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多