Показать совпадающие результаты сначала с WHERE IN (), а затем с другими результатами - MYSQL - PullRequest
0 голосов
/ 02 марта 2019

У меня есть следующие таблицы:

пользователь

id  | Name    | ...
1   | John    |
2   | Richard |
3   | Michael |

книга

id  | title | author| ...
1   | ABC   |  Z    |
2   | ABM   |  X    |
3   | IJK   |  W    |
4   | MNO   |  Z    |
5   | ABQ   |  Y    |

fav_book

user_id  | book_id
1        |   5   |  
1        |   4   | 
3        |   1   | 
3        |   2   | 
3        |   5   | 

Теперь, если John ищет книгу под названием Ab, я хочу сначала показать его любимую книгу в результатах поиска, а затем остальные.

Выводдля John поиска Ab должно быть

id  | title
5   | ABQ
1   | ABC
2   | ABM

Я пробовал:

SELECT * FROM (
(SELECT id, title
FROM book 
WHERE id IN(5,4) AND title LIKE 'Ab%')
UNION ALL
(SELECT id, title
FROM book )
) tbl ORDER BY ???

ТАК, как я могу манипулировать моим предложением order by, чтобы получить желаемый результат.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Полагаю, вы не хотите жестко кодировать избранные книги для каждого пользователя.Если вам нужны результаты для user_id = 1 и поиска для title, начинающегося с 'Ab':

select 
  id, title
from book 
where title like 'Ab%'
order by (
  case when id in (select book_id from fav_book where user_id = 1) then 0
  else 1 end
), title

См. demo

0 голосов
/ 02 марта 2019

Я думаю, вы просто хотите настроить order by:

SELECT id, title
FROM book 
WHERE title LIKE 'Ab%'
ORDER BY (id IN (5, 4)) DESC  -- put these first

MySQL рассматривает логическое значение как целое число в числовом контексте.«true» имеет значение 1, а «false» 0;вот почему это ставит соответствующие идентификаторы на первое место.

Вы можете добавить еще одну клавишу ORDER BY, чтобы упорядочить значения в каждом подмножестве (избранное и не избранное):

ORDER BY (id IN (5, 4)) DESC,  -- put these first
         id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...