我在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号的巨大记录集。有人可以帮我正确格式化这个查询吗?
答案 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还是on
,NULL
都会在第一个表中保留所有行。即使是第一张桌子上的情况也是如此。因此,当left join
子句中的条件在on
子句中时,有效地忽略它们。