SQL - приоритет с использованием UNION - PullRequest
0 голосов
/ 21 ноября 2019

В настоящее время я работаю над поисковой системой для веб-сайта. У меня есть таблица Фильмы:

| id_movie | title                    | subtitle                   | primary_keyword     | keywords              | reference |
|-----------|--------------------------|----------------------------|----------------------|-----------------------|-----------|
| 1         | The Lord of the Rings    | The Fellowship of the Ring | lord rings           | lord rings fellowship | LORFR     |
| 2         | The Lord of the Rings    | The Two Towers             | lord rings           | lord two towers       | LORTT     |
| 3         | The Lord of the Rings    | The Return of the King     | lord                 | return king           | LORRK     |
| 4         | The Shawshank Redemption |                            | shawshank redemption | shawshank redemption  | SSR       |

(Это только пример)

Я хочу сделать поиск с этим приоритетом: 1 - Ссылка 2 - Название 3 - Ключевые слова 4 - ПервичнаяКлючевое слово 5 - Субтитры

Это то, что у меня есть:

SELECT * FROM (
SELECT 1 as prio, title, subtitle, reference
 FROM   movies 
 WHERE  reference LIKE '%rings%'
UNION 
SELECT 2 as prio, title, subtitle, reference
 FROM   movies 
 WHERE  title LIKE '%rings%'
UNION 
SELECT 3 as prio, title, subtitle, reference
 FROM   movies 
 WHERE  keywords LIKE '%rings%'
UNION 
SELECT 4 as prio, title, subtitle, reference
 FROM   movies 
 WHERE  primary_keyword LIKE '%rings%'
UNION 
SELECT 5 as prio, title, subtitle, reference
 FROM   movies 
 WHERE  subtitle LIKE '%rings%') as BigSelect
 ORDER BY prio ASC

Это работает, но я хочу: если у двух фильмов в заголовке есть «кольца», то следующим приоритетом являетсяключевые слова Тогда, если у них есть оба «кольца» в ключевых словах, проверьте primary_keyword ....

Окончательный результат, который я хочу получить:

| title                     | subtitle                   | reference |
|---------------------------|----------------------------|-----------|
| The Lord of the Rings     | The Fellowship of the Ring | LORFR     |
| The Lord of the Rings     | The Two Towers             | LORTT     |
| The Lord of the Rings     | The Return of the King     | LORRK     |

Три «Властелина колец» имеют «кольца»в названии. Тогда только «Братство Кольца» имеет «кольца» в ключевых словах. Тогда «Две Башни» имеют «кольца» в первичном ключевом слове (не Возвращение Короля)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2019

Используйте order by с несколькими ключами:

SELECT title, subtitle, reference
FROM movies
ORDER BY (reference LIKE '%rings%') DESC,
         (title LIKE '%rings%') DESC,
         (keywords LIKE '%rings%') DESC, 
         (primary_keyword LIKE '%rings%') DESC,
         (subtitle LIKE '%rings%') DESC;

MySQL удобно обрабатывает логические выражения как числа с «1» для true и «0» для false. Следовательно, DESC ставит совпадения на первое место.

0 голосов
/ 21 ноября 2019

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

SELECT title, subtitle, reference
 FROM   movies 
 WHERE  reference LIKE '%rings%' OR title LIKE '%rings%' OR keywords LIKE '%rings%' OR primary_keyword LIKE '%rings%' OR subtitle LIKE '%rings%'
ORDER BY
CASE
WHEN reference LIKE '%rings%' AND title IKE '%rings%' AND keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' AND subtitle LIKE '%rings%' THEN 1
WHEN reference LIKE '%rings%' AND title IKE '%rings%' AND keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' THEN 2
WHEN reference LIKE '%rings%' AND title IKE '%rings%' AND keywords LIKE '%rings%' THEN 3
WHEN reference LIKE '%rings%' AND title IKE '%rings%' THEN 4
WHEN reference LIKE '%rings%' THEN 5
WHEN title LIKE '%rings%' AND keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' AND subtitle LIKE '%rings%' THEN 6
WHEN title LIKE '%rings%' AND keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' THEN 7
WHEN title LIKE '%rings%' AND keywords LIKE '%rings%' THEN 8
WHEN title LIKE '%rings%' THEN 9
WHEN keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' AND subtitle LIKE '%rings%' THEN 10
WHEN keywords LIKE '%rings%' AND primary_keywords LIKE '%rings%' THEN 11
WHEN keywords LIKE '%rings%' THEN 12
WHEN primary_keywords LIKE '%rings%' AND subtitle LIKE '%rings%' THEN 13
WHEN primary_keywords LIKE '%rings%' THEN 14
WHEN subtitle LIKE '%rings%' THEN 15
END
...