Mysql: заказ как? - PullRequest
       31

Mysql: заказ как?

28 голосов
/ 31 августа 2010

предположим, что мы выполняем поиск по ключевым словам: ключевое слово1, ключевое слово2, ключевое слово3

в базе данных есть записи с колонкой "имя":

1: John Doe
2: Samuel Doe
3: John Smith
4: Anna Smith

сейчас Запрос:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%")

выберет записи: 1,2,3 (в этом порядке) но я хочу заказать его по ключевому слову в примере keyword1=John, keyword2=Doe поэтому он должен быть указан по ключевым словам: 1,3,2 (потому что я хочу выполнить поиск «Доу» после поиска «Джон»)

Я думал о SELECT DISTINCT FROM (...... UNION .....) но будет намного проще заказать его как-нибудь по-другому (реальный запрос очень длинный)

Есть ли какие-нибудь хитрости для создания такого заказа?

Ответы [ 5 ]

59 голосов
/ 31 августа 2010
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%"  then 2 
    else 3 
end
3 голосов
/ 31 августа 2010

Чтобы опираться на ответ RedFilter, вы можете сделать строки с обоими ключевыми словами вверху:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2
when name LIKE "%Doe%"  then 3
end
3 голосов
/ 31 августа 2010

Читать на Булевский полнотекстовый поиск , с помощью которого вы можете сделать заказ.

2 голосов
/ 31 августа 2010
 SELECT * 
 from
 (
  SELECT u.*, 1 OrderNum 
  FROM users 
  WHERE (name LIKE "%John%")
  UNION 
  SELECT u.*, 2 OrderNum 
  FROM users 
  WHERE (name LIKE "%Doe%")
  )
  Order by OrderNum
0 голосов
/ 18 декабря 2015

Мой пример упорядочит все John в алфавитном порядке, а затем Doe.

ORDER BY CASE
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name)
    WHEN name LIKE "John%"    THEN CONCAT('b',name)
    WHEN name LIKE "%Doe"     THEN CONCAT('c',name)
    ELSE name  
END  
...