mysql left outer join返回所有行,忽略指定的字段值

时间:2017-08-14 18:52:35

标签: mysql left-join

我在MySQL数据库中有两个表:

cellphone table
ID
phone_number

verification_code table
ID
verification_codes
code_expires
code_used

我正在尝试查询手机信息表中的特定ID,我想知道他们是否拥有有效的验证码。

这是我的查询

SELECT a.ID, a.phone_number, b.verification_code, b.code_expires
FROM cellphone a
LEFT OUTER JOIN verification_codes b ON (a.ID = b.ID
  and a.ID = '12345'
  and b.code_expires > NOW()
  and b.code_used IS NULL)

我没有获得我正在寻找的ID,而是获得了一个包含所有ID号的巨大记录集。有人可以帮我正确格式化这个查询吗?

1 个答案:

答案 0 :(得分:3)

left join第一个表中的条件进入where子句。 second 中的条件进入on

SELECT c.ID, c.phone_number, vc.verification_code, vc.code_expires
FROM cellphone c LEFT OUTER JOIN
     verification_codes vc
     ON c.ID = vc.ID AND  vc.code_expires > NOW() and vc.code_used IS NULL
WHERE c.ID = '12345';  -- single quotes are unnecessary if the id is a number

原因很简单。无论left join子句的计算结果为true,false还是onNULL都会在第一个表中保留所有行。即使是第一张桌子上的情况也是如此。因此,当left join子句中的条件在on子句中时,有效地忽略它们。