先显示与WHERE IN()匹配的结果,然后再显示其他结果-MYSQL

时间:2019-03-02 12:00:11

标签: mysql sql

我有下表:

用户

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    |

收藏夹

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 :(得分:1)

我认为您只想调整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;这就是为什么将匹配的ID放在第一位的原因。

您可以添加另一个ORDER BY键来对每个子集(收藏夹和非收藏夹)中的值进行排序:

ORDER BY (id IN (5, 4)) DESC,  -- put these first
         id

答案 1 :(得分:1)

我想您不想对每个用户的收藏夹进行硬编码。
如果您想要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