MySQL double LEFT OUTER JOIN - PullRequest
       1

MySQL double LEFT OUTER JOIN

5 голосов
/ 18 января 2012

В

У меня есть две таблицы profile и name , таблица профиля содержит некоторые метаданные, относящиеся к пользователю. Таблица имен содержит все возможные имена, которые может иметь профиль.

Я пытаюсь создать запрос 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?

Ответы [ 3 ]

5 голосов
/ 18 января 2012

Вы фильтруете 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
4 голосов
/ 18 января 2012

Как только у вас есть предложение WHERE для таблицы, которая обрабатывается LEFT JOIN, вы сразу же удалите строки 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
0 голосов
/ 08 марта 2013
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 относится к таблице имен age относится к таблице профилей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...