如何在mysql连接中选择可能不存在的行

时间:2013-04-02 18:52:04

标签: mysql sql join

我需要在需要返回单行的查询中加入两个表。从一个表中我将选择一个始终存在的行。从第二个开始,我需要选择两行,其中一行将始终存在,另一行仅在有时存在。

我可以在第二个表中存在两行而不存在第二行的情况下使这个工作。

以下是我的架构的简化示例

表1:公司

COMPANY_ID int

------------
|COMPANY_ID|
------------
|         1|
|         2|
------------

表2:偏好

COMPANY_ID int,
PREFERENCE_ID int,
PREFERENCE_VALUE varchar

-------------------------------------------
|COMPANY_ID|PREFERENCE_ID|PREFERENCE_VALUE|
-------------------------------------------
|         1|            1|             foo|
|         1|            2|             bar|
|         2|            1|             baz|
-------------------------------------------

我正在寻找的是一个查询,当COMPANY_ID = 1时,它将返回包含PREFERENCE_ID的行,当COMPANY_ID = 2时,返回一行PREFERENCE_ID和空单元格(或零或任何默认值)。

我正在尝试使用像

这样的查询
select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2 
  from 
    COMPANIES 
    join PREFERENCES p1 on c.ID = p1.COMPANY_ID 
    join PREFERENCES p2 on c.ID = p2.COMPANY_ID 
   where 
     p1.PREFERENCE_ID = 1 and 
     p2.PREFERENCE_ID = 2 and 
     COMPANIES.ID = 1;

当我使用COMPANY_ID = 1(其中有PREFERENCE_IDs 1 2)运行此查询时,它运行正常。当我使用COMPANY_ID = 2运行它时,它返回一个空集。我尝试过使用第二次连接的左连接,但不会改变任何内容。

我希望它返回:

查询中的COMPANY_ID = 1:

------------------
|ID|VALUE1|VALUE2|
------------------
| 1|   foo|   bar|
------------------

并且对于COMPANY_ID = 2,它可以为VALUE2返回任何内容。 null,空白,0,我不在乎:

------------------
|ID|VALUE1|VALUE2|
------------------
| 2|   baz|      |
------------------

任何建议的TIA。

1 个答案:

答案 0 :(得分:2)

问题是WHERE子句。 LEFT JOIN将返回空值并准确生成您要查找的内容,但查询中的WHERE会否定该内容。

select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2 
  from 
    COMPANIES 
    inner join PREFERENCES p1 
      on c.ID = p1.COMPANY_ID and p1.PREFERENCE_VALUE = 1
    left outer join PREFERENCES p2 
      on c.ID = p2.COMPANY_ID and p2.PREFERENCE_VALUE = 2
   where 
     COMPANIES.ID = 1;