Объедините два запроса SELECT, если один не найден - PullRequest
0 голосов
/ 02 марта 2019

Я стремлюсь эффективно объединить два запроса на выборку в один запрос с учетом производительности.

Я хочу, чтобы первый SELECT получил строку.Если строка не существует, выполните другой запрос SELECT.Если строка существует из первого запроса, используйте строку, найденную в первом запросе, и не выполняйте / не получайте ничего из второго запроса.

Вот мои два запроса:

$stmt = $dbh->prepare("SELECT * FROM users WHERE unique_code = :unique_code LIMIT 1");
$stmt->bindParam(':unique_code', $uniqueCode);
$stmt->execute();
$row = $stmt->fetch();

if(!$row) { // If row does not exist
    $stmt = $dbh->prepare("SELECT * FROM users WHERE birthday = :birthday LIMIT 1");
    $stmt->bindParam(':birthday', $birthday);
    $stmt->execute();
    $row = $stmt->fetch();
}

Как я могу это сделать?

РЕДАКТИРОВАТЬ: пример данных:

id | unique_code | birthday
-----------------------------
 1       123      1987-05-20
 2       456      1955-03-10

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете сделать это в одном запросе, комбинируя ваши WHERE условия и затем упорядочивая их в зависимости от того, какой из них соответствует:

SELECT * 
FROM users 
WHERE unique_code = :unique_code OR birthday = :birthday
ORDER BY unique_code = :unique_code DESC
LIMIT 1

Если уникальный код соответствует, unique_code = :unique_code будет 1, и так как мысортируют DESCENDING, эта строка будет стоять первой (и будет единственной строкой, оставшейся после предложения LIMIT. Если уникальный код не совпадает, то при наличии каких-либо строк они должны совпадать в день рождения.

Демонстрация на dbfiddle

...