mysql select - 如果给定选项不匹配,则匹配不同的选项

时间:2015-09-24 19:14:51

标签: php mysql

我正在尝试通过ID号在表格中查找用户。一些用户没有身份证号码,所以对于他们我想通过birthdate找到。所以我想要一个执行此操作的select语句:

的伪代码:

SELECT user FROM users WHERE id = idnumber
      if that is not found, then
                     WHERE dob = dob

如果匹配id,我不想匹配出生日期,因为这会返回太多结果。我可以在两个单独的选择中做到这一点,但我想尽可能避免这种情况。

我正在使用PHP和PDO

2 个答案:

答案 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)上的索引。