我正在尝试通过ID号在表格中查找用户。一些用户没有身份证号码,所以对于他们我想通过birthdate找到。所以我想要一个执行此操作的select语句:
的伪代码:
SELECT user FROM users WHERE id = idnumber
if that is not found, then
WHERE dob = dob
如果匹配id,我不想匹配出生日期,因为这会返回太多结果。我可以在两个单独的选择中做到这一点,但我想尽可能避免这种情况。
我正在使用PHP和PDO
答案 0 :(得分:3)
SELECT user FROM users
WHERE id = :idnumber
OR (NOT EXISTS (SELECT user FROM users WHERE id = :idnumber)
AND dob = :dob)
答案 1 :(得分:2)
您可以使用OR
执行此操作并确定优先级。假设你只想要一行:
SELECT u.user
FROM users u
WHERE u.id = $idnumber or u.dob = $dob
ORDER BY (u.id = $idnumber) DESC
LIMIT 1;
或者,如果您想要多行,那么Barmar解决方案的变体可能会更好地优化:
SELECT u.user
FROM users u
WHERE u.id = :idnumber
UNION ALL
SELECT u.user
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM users u2 WHERE u2.id = $idnumber) AND
dob = $dob;
对于使用OR
条件的索引,MySQL可能很挑剔。此版本肯定会使用users(id)
和users(dob)
上的索引。