簡體   English   中英

MySQL雙LEFT OUTER JOIN

[英]MySQL double LEFT OUTER JOIN

我有兩個表格配置文件名稱 ,配置文件表包含一些與用戶相關的元數據。 名稱表包含配置文件可能具有的所有可能名稱。

我正在嘗試創建一個MYSQL查詢,它將為我提供profile.age,所有配置文件的給定名稱和系列名稱,即使它沒有給定的名稱或系列名稱

輪廓

+-------+---------+
    | ID    | AGE     | 
    +-------+---------+
    | 0     |  10     |
    | 1     |  20     |
    | 2     |  30     |
    | 3     |  40     |
    +-------+---------+

名稱

+------------+--------+--------+
    | PROFILE_ID |  TYPE  |  NAME  | 
    +------------+--------+--------+
    |      0     |   0    | Jo     |
    |      0     |   1    | Blog   |
    |      1     |   0    | Jim    |
    |      2     |   1    | Smith  |
    +------------+--------+--------+

    Type 0 = Given Name
    Type 1 = Family Name

Quert

這是我目前使用的查詢。

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
FROM profile
LEFT OUTER JOIN name given ON profile.id = given.profile_id
LEFT OUTER JOIN name family ON profile.id = family.profile_id
WHERE given.type = 0 
AND profile_id.type = 1 
LIMIT 0 , 30

問題

這是我想要的結果

+------------+-------------+--------+
    | GIVEN_NAME | FAMILY_NAME | ADE    |
    +------------+-------------+--------+
    | Jo         | Blog        | 10     |
    | Jim        | NULL        | 20     |
    | NULL       | Smith       | 30     |
    | NULL       | NULL        | 40     |
    +------------+-------------+--------+

然而,這是我實際得到的

+------------+-------------+--------+
    | GIVEN_NAME | FAMILY_NAME | AGE    |
    +------------+-------------+--------+
    | Jo         | Blog        | 10     |
    +------------+-------------+--------+

根據我的理解, LEFT OUTER JOIN應返回NULL值連接。 我究竟做錯了什么? 如何更改我的查詢以返回NULL值joun?

您將過濾type設置為0或1(在where子句中),這將忽略null s。

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
    FROM profile
    LEFT OUTER JOIN name given 
       ON profile.id = given.profile_id and given.type = 0 
    LEFT OUTER JOIN name family 
       ON profile.id = family.profile_id and profile.type = 1 
    LIMIT 0 , 30

只要在正在進行LEFT JOIN的表上有WHERE子句,就會立即消除NULL行(即沒有匹配的位置)。 因此對於初學者,您應該將given.type = 0的條件移動到ON子句而不是WHERE子句中。 而且我將假設您在WHERE子句中的其他條件存在問題。

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
FROM profile
LEFT OUTER JOIN name given ON profile.id = given.profile_id AND given.type = 0 
LEFT OUTER JOIN name family ON profile.id = family.profile_id AND family.type = 1
LIMIT 0 , 30
SELECT N1.id, N1.name,N2.name, A3.age 
FROM name N1, name N2, age A3 
WHERE N1.id=N2.id AND N1.id=A3.id 
  AND N1.type=0   AND N2.type=1

name是指name表age是指profile表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM