如何使用左前加入MySQL的地方

时间:2017-05-03 19:40:41

标签: mysql sql

我有两个具有这样结构的表。首先是用户表:

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

和报告表:

user_id  | field  | text
  1         4       Tom

即使用户在email表中没有匹配项,如何返回passwordreport值?这是我到目前为止所做的。

    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;

所需输出以获取ID为2的用户的信息:

email  |   password   | text
'new2'     'pass'      

到目前为止,我目前还没有得到任何回报

3 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

left join first 表中的条件进入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子句执行此过滤。

答案 2 :(得分:0)

我不确定您是否正确地将查询粘贴到您的问题中,但如果我了解您所追求的内容,那么这应该有效:

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子句中。