Приоритетное условие в MySQL - PullRequest
1 голос
/ 05 сентября 2011

Мне нравится выбирать строку по приоритету в MySQL.Я не знаю, возможно ли это, но см. Пример ниже:

id name
1  John
2  Doe
3  Mary
4  Jhonny

Предположим, что я не знаю идентификатор, но по определенной причине мне нужно выбрать по приоритету: 3, 2, 1 ... В этом случае будет выбран МЭРИ (# 3).Но если мне потребуется выбрать по порядку 5, 2, 1, будет выбран DOE (# 2).

Хорошо, я могу сделать это с помощью IN (5, 2, 1).Проблема в том, что если у меня нет результатов (например, IN (5, 6, 7)), мне нужна хотя бы одна строка (неважно, что).

Например: выберите 5,6, 7 ... ничего не найдено ... затем выберите первое найденное (как у ДЖОНА).

Возможно?

Пока!

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

ORDER BY FIND_IN_SET(`id`, '5,6,7') DESC

Ответы [ 3 ]

6 голосов
/ 05 сентября 2011
SELECT *
FROM your_table
ORDER BY 
(CASE id 
WHEN 5 THEN 1
WHEN 6 THEN 2
WHEN 7 THEN 3
ELSE id+10
END)
LIMIT $some_limit;

Трюк используется на order by

Таким образом, соответствующий идентификатор 5 даст приоритет 1,
соответствующий идентификатор 6 даст приоритет 2,
соответствующий идентификатор 7 даст приоритет 3,
в противном случае, наименьший идентификатор вернет

, если вы используете unsigned для идентификатора

0 голосов
/ 27 февраля 2014

ВЫБЕРИТЕ U.username, id ИЗ ТБЛЮЗЕРА U ORDER BY FIND_IN_SET (username, 'Tester') DESC, имя пользователя ACS

Это приоритеты (дает сначала) "Тестер", а затем сортировать его A-Z

0 голосов
/ 05 сентября 2011

Сначала вам нужен столбец ID переназначения для заказа столбца, давайте сделаем это с помощью специального объединения (первый столбец - ваш идентификатор, второй - инструкция заказа):

 SELECT 5 as ID, 1 as ord
 UNION ALL SELECT 2 , 2
 UNION ALL SELECT 1 , 3

Понятно?если так - давайте сделаем полный пример:

SELECT m.* from MyTable m
    LEFT OUTER JOIN (
       SELECT 5 as ID, 1 as ord
       UNION ALL SELECT 2 , 2
       UNION ALL SELECT 1 , 3
    ) o ON m.ID = o.ID
ORDER BY  COALESCE(o.ord, 100)
...