Как и равный порядок SQL на равных? - PullRequest
1 голос
/ 01 сентября 2011

Скажите, у меня есть следующая таблица:

ID      Author
---------------------
1       Bill
2       Joe
3       Bill and Joe
4       Bill

И я хочу получить результирующий набор из:

SELECT id FROM table WHERE Author LIKE '%Bill%' OR Author = 'Bill'

Как я мог бы упорядочить его так, чтобы строки, совпадающие с равенством, были возвращены первыми строками, а после совпадают совпадения? например Запрос вернет 1,4,3. Я использую MySQL, но принимаю ответы в любой БД.

Ответы [ 4 ]

8 голосов
/ 01 сентября 2011
SELECT  id
FROM    YourTable
WHERE  Author LIKE '%Bill%' 
ORDER BY CASE WHEN Author = 'Bill' THEN 0
              ELSE 1
         END 

Возможно, вы также можете просто сделать ORDER BY Author != 'Bill' - Не уверен насчет порядка по логическим выражениям в MySQL.

2 голосов
/ 01 сентября 2011
SELECT id 
FROM table 
WHERE Author LIKE '%Bill%'
order by if(author='Bill',1,2)
0 голосов
/ 26 сентября 2011

Если этот тест необходимо расширить до нескольких переменных, я немного расширил ответ Мартина следующим образом (например, по 3 критериям):

SELECT  id
FROM    YourTable
WHERE  Author LIKE '%Bill%' 
ORDER BY 
(CASE WHEN criteria_1='target_1' THEN 1 ELSE 2 END) 
*
(CASE WHEN criteria_2='target_2' THEN 1 ELSE 2 END) 
*
(CASE WHEN criteria_3='target_3' THEN 1 ELSE 2 END) 

С наилучшими пожеланиями (и большое спасибо Мартину),

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

Я проверил ваши данные в БД, и ORDER BY работает, как вам угодно, без проблем, но вы можете использовать следующий запрос:

Новый запрос:

select Author, CONCAT(Author, ' ') as text_n 
from table where Author like '%Bill%' order by text_n;

Ваш отредактированный запрос:

SELECT id FROM table WHERE Author LIKE '%Bill%' order by Author;
...