У меня есть две таблицы, которые имеют такую структуру. Сначала таблица пользователей:

id  |  email  | password
 1    'email'    'pass'
 2    'new2'      'pass'

И таблица отчета:

user_id  | field  | text
  1         4       Tom

Как я могу вернуть значения email и password, даже если у пользователя нет совпадений в таблице report? Это то, что я до сих пор.

    select a.email, a.password, b.text from users a
    left join data b
    on a.id = b.user_id
    and b.field = 4
    and a.id = 2;

Желаемый вывод для получения информации о пользователе с идентификатором 2:

email  |   password   | text
'new2'     'pass'      

В настоящее время я ничего не получаю с тем, что я пробовал до сих пор

0
met_k 3 Май 2017 в 22:40

3 ответа

Лучший ответ

Условия для таблицы first в left join содержатся в предложении where. Условия для таблицы second указаны в предложении on:

select u.email, u.password, d.text
from users u left join
     data d
     on u.id = d.user_id and d.field = 4
where a.id = 2;

На первый взгляд правило может показаться произвольным. Однако это не так. left join возвращает все строки в первой таблице независимо от того, о том, имеет ли условие on значение true. Следовательно, условие фильтрации в первой таблице не отфильтровывает строки. Предложение where выполняет эту фильтрацию.

1
Gordon Linoff 3 Май 2017 в 19:46

Попробуй это:

SELECT 
      u.email
    , u.password
    , r.text

FROM 
    users AS u

    LEFT JOIN report AS r
        ON r.user_id = u.id

WHERE 
    u.id = 2
0
xcvd 3 Май 2017 в 19:45

Я не уверен, что вы вставили свой запрос в свой вопрос правильно, но если я понимаю, что вы ищете, это должно сработать:

SELECT a.email, a.password, b.text
FROM   users a
LEFT JOIN report b ON a.id = b.user_id
WHERE  a.id = 2

Непонятно, почему вы пытаетесь проверить b.field, но если вам нужно это сделать, добавьте его в LEFT JOIN. В общем случае, помещайте условия в LEFT JOIN ... ON, когда вы все еще хотите, чтобы строки были возвращены, и помещайте условия в предложение WHERE, когда их строки не должны возвращаться, если условие не выполняется.

0
Andrew 3 Май 2017 в 19:46