2015-11-21 4 views
2

В MySQL я пытаюсь получить одну строку из базы данных, если она не существует, и в этом случае я хочу, чтобы она извлекала вторую строку. У меня код написан, но по какой-то причине он извлекает обе строки. Если первая строка не найдена, она извлекает вторую строку. Поэтому, независимо от того, он всегда извлекает вторую строку.MySQL IF/WHEN/ELSE/OR

SELECT * 
FROM `members` 
WHERE 
`id` = 49 
or `id` = 0 

Я пробовал много вариантов (когда/то/другое, и т.д.) на различных базах данных с различными столбцами, и она всегда возвращает обе строки.

Как я могу получить только одну строку, которая мне нужна? А также, может ли кто-нибудь объяснить мне, почему он это делает? Спасибо.

+0

http://www.w3schools.com/php/php_mysql_select_limit.asp проверить эту страницу –

+0

@Brake Karasoy: Проблема с этим методом заключается в том, что он не универсален. Сначала я хочу получить идентификатор 49, но иногда второй может иметь идентификатор выше 49 – Tom

ответ

2

Какая строка вы хотите в первую очередь? id = 49? Вы можете попробовать с помощью mysql's ORDER BY в сочетании с LIMIT, чтобы получить желаемые результаты. Например, если вы хотите получить идентификатор 49 первых вы можете сделать:

SELECT * FROM members WHERE id = 49 OR id = 0 ORDER BY FIELD(id, 49, 0) LIMIT 1

Это упорядочивает результаты по полю id, но ограничить результаты только одной строки. Так что, если не существует ряда с id = 49 он все равно получит первую строку в списке, который был бы id = 0

+0

. Проблема с этим методом заключается в том, что он не универсален. Сначала я хочу получить идентификатор 49, но иногда второй может иметь идентификатор выше 49 – Tom

+0

, значение id не имеет значения в этом случае, если вы используете 'ORDER BY FIELD', он просто закажет ваши результаты тем, как вы перечислите их в следующем списке, разделенном запятыми. Чтобы добавить к моему ответу, если вы хотите получить id 0, сначала все, что вам нужно было бы сделать, чтобы изменить это, используйте 'ORDER BY FIELD (id, 0, 49)' вместо –

+0

О, я вижу! Спасибо, это определенно полезно. Кстати, почему эта функция работает так? Это кажется непрактичным. – Tom

0

Альтернативный подход заключается в использовании union all с некоторой логикой для проверки:

SELECT m.* 
FROM members m 
WHERE id = 49 
UNION ALL 
SELECT m.* 
FORM members m 
WHERE id = 0 AND NOT EXISTS (SELECT 1 FROM member m2 WHERE m2.id = 49); 

В некоторых случаях , это может быть немного быстрее.

0

Вы можете заказать по высказываниям:

ORDER BY (id = 49) DESC 

DESC потому что (id = 49) является 1 для строки вы хотите первым.

Если вы хотите только 1, LIMIT 1. Если вы хотите больше, вы можете приковать их в пользовательской сортировки:

ORDER BY (id = 14) DESC, (id = 43) DESC, (id = 49) DESC LIMIT 3 

т.д.

Очень легко запомнить.