MySQL приоритет выборки по столбцам

255
19 октября 2018, 00:20

Внимательно изучил вот эту тему Приоритет выборки WHERE ... OR, но у меня другой вопрос.

Здесь создал тест, но что-то барахлит ресурс: http://sqlfiddle.com/#!9/aa25a8/5

CREATE TABLE table_name (id INT, head VARCHAR(90), main_tag VARCHAR(90), tags VARCHAR(90), texts TEXT);
INSERT INTO table_name VALUES (1,'bowling balls','balls', 'four;Chuck', 'Chuck Norris once ate four 30lb bowling balls without chewing.'),
                                    (2,'rilled bird','bird', 'kill;stone', 'Chuck Norris killed two stones with one bird.'),
                                    (4,'The quickest way','Chuck', 'quick;Chuck', 'The quickest way to a man\'s heart is with Chuck Norris\' fist.'),
                                    (5,'Lady GaGa','IE', 'canvas;explorer', 'Lady GaGa uses canvas in IE.'),
                                    (6,'Wild program','program', 'form;WEB', 'Chuck Norris programs do not accept input.'),
                                    (7,'Chuck vs Rambo','Rambo', 'cool;Chuck', 'To Silvester Stallone, everything contains a vulnerability.');

В общем, мне нужна сортировка при выводе по приоритету: сначала, если слово 'Chuck' встречается в 'head', затем в 'main_tag' и т.д.

В голову пришло только:

SELECT * FROM table_name
WHERE head LIKE '%Chuck%' OR main_tag LIKE '%Chuck%'
OR tags LIKE '%Chuck%' OR texts LIKE '%Chuck%'

И ORDER BY здесь, понятное дело, ни при чем.

UPD: See solution - http://sqlfiddle.com/#!9/2ad2235/12

Answer 1

Приоритеты операторов проявляются при проверке строки, а порядок в котором строки выдаются запросом называются "порядок сортировки", а не "приоритет" и задаются соответственно предложением order by. Учитывая, что в MySQL любое логическое выражение возвращает 0 или 1 то нам надо отсортировать выборку так, что бы срабатывание условия, давшее 1 оказалось первым, т.е. сортируем по условию в обратном (desc) порядке:

SELECT *
  FROM table_name
 WHERE head LIKE '%Chuck%' OR main_tag LIKE '%Chuck%'
    OR tags LIKE '%Chuck%' OR texts LIKE '%Chuck%'
 ORDER BY head LIKE '%Chuck%' OR main_tag LIKE '%Chuck%' desc,
          tags LIKE '%Chuck%' OR texts LIKE '%Chuck%' desc

В принципе последнее условие можно было не добавлять, потому что первое уже выведет на первое место совпадения в head.

Пример на sqlfiddle.com

READ ALSO
Подскажите в файловой системе сайта на хостинге в какой папке можно найти, какая база данных подвязана к сайту?

Подскажите в файловой системе сайта на хостинге в какой папке можно найти, какая база данных подвязана к сайту?

Подскажите в файловой системе сайта на хостинге в какой папке можно найти, какая база данных подвязана к сайту? Скриншот файловой системы...

202
Посчитать место занимаемое в таблице

Посчитать место занимаемое в таблице

Категорически приветствую! Существует mysql-сервер (mysqld Ver 56

184
Кодировка БД и Сервлета UTF-8 не работает должным образом

Кодировка БД и Сервлета UTF-8 не работает должным образом

Имеется Web-приложение для регистрации документов (те

183
Стилизация детей в CSS

Стилизация детей в CSS

ЗдравтсвуйтеНужна помощь в вертске flex-блоки таким образом, чтобы все элементы + 1 начиная со второго имели одинаковые стили

211