【问题标题】:Join tables keeping empty results连接表保持空结果
【发布时间】:2016-01-16 15:28:31
【问题描述】:

我有两张表需要交叉并返回与其中一张的 id 一样多的结果。

第一个是角色/任务表:

id | rolename
---+---------
1  | check_in
2  | cleaning
3  | taxi
4  | guide
5  | car_rental
6  | meals
7  | house_owner
20 | custom

还有另一个包含这些列的表:

id | client_booking_id | staff_role_id | confirmed | staff_cost

我需要一个查询,它总是给我与第一个表中的 nr 列一样多的结果。因为对于每个唯一的client_booking_id,这些任务/角色中只有一个(如果有的话)。

如果我这样做:

SELECT sr.role_name, sr.id, ss.staff_cost, ss.confirmed 
    FROM staff_role AS sr
    LEFT JOIN staff_schedule AS ss ON sr.id=ss.staff_role_id

我得到了我想要的 nr 行的结果。现在我需要将它与特定的client_booking_id 匹配,所以我做到了

SELECT sr.role_name, sr.id, ss.staff_cost, ss.confirmed 
    FROM staff_role AS sr
    LEFT JOIN staff_schedule AS ss ON sr.id=ss.staff_role_id
    WHERE ss.client_booking_id=1551 // <-- this is the new line

这只给了我 2 个结果,因为在第二张桌子上我只为 id 预订了 2 个任务。

但我需要所有任务的结果,即使是那些不匹配的任务,也需要 NULL 值。我该怎么做?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    通过您的查询(没有where 子句),您将获得null 和非null 值的行client_booking_id。您希望匹配特定的 client_booking_id 并同时保留所有具有 null 值的记录,因此您将具有特定 client_booking_id 的附加条件添加到 left join

    移动条件到left join:

    select sr.role_name
         , sr.id
         , ss.staff_cost
         , ss.confirmed 
    from staff_role sr
    left join staff_schedule ss on sr.id = ss.staff_role_id
                               and ss.client_booking_id = 1551
    

    【讨论】:

    • 第一个查询是正确的。第二个不正确;当有其他客户预订 ID 时,它将删除行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多