【问题标题】:mysql outer join with wheremysql外连接与where
【发布时间】:2014-06-03 17:28:09
【问题描述】:

我有一个数据库,其中用户必须有一个用户名,并且在另一个表上有一个可选的联系人名称,由每个用户提供给他们。

例如:

用户 A 可能称用户 B 'FOO'

但用户 C 称用户 B 为“BAR”

用户 D 可能没有给用户 B 一个联系人姓名

所以它应该返回 NULL。

下面的查询可以让我得到所有的用户名和联系人姓名,即使是 NULL 这是所需的结果。

SELECT Login.username, PhoneNumber.phone, AddressBook.contact_name FROM Login
LEFT OUTER JOIN PhoneNumber ON Login.id = PhoneNumber.user_id
LEFT OUTER JOIN AddressBook ON PhoneNumber.phone = AddressBook.phone

但是,我只想返回 WHERE AddressBook.user_id = 67,它将返回用户 A 关联的用户名和联系人姓名。

目前,当我添加 WHERE AddressBook.user_id = 67 时,它不会返回任何预期的带有 NULL 值的联系人名称,但我需要那些带有 NULL 且没有 NULL 联系人名称的行。

我该怎么做?

谢谢

【问题讨论】:

    标签: mysql sql join outer-join


    【解决方案1】:

    AddressBook.user_id = 67 添加到JOIN 怎么样:

    SELECT l.username, p.phone, a.contact_name 
    FROM Login l
    LEFT OUTER JOIN PhoneNumber p ON l.id = p.user_id
    LEFT OUTER JOIN AddressBook a ON p.phone = a.phone AND a.user_id = 67
    

    【讨论】:

      【解决方案2】:
      SELECT Login.username, PhoneNumber.phone, AddressBook.contact_name FROM Login
      LEFT OUTER JOIN PhoneNumber ON Login.id = PhoneNumber.user_id
      LEFT OUTER JOIN (SELECT contact_name, phone, user_id from AddressBook where user_ID = 67 order by 1,2,3)ON PhoneNumber.phone = AddressBook.phone
      

      我认为这就足够了。使您的第二个左联接仅返回具有 67 作为用户 ID 的行。但老实说,在不了解您的人际关系的情况下,这很难说。

      电话号码真的是您可以加入的唯一字段吗?

      【讨论】:

        猜你喜欢
        • 2017-06-24
        • 1970-01-01
        • 2013-07-28
        • 2013-03-14
        • 2017-03-09
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多