我有下表:
用户
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
子句以获得所需的结果。谢谢。
答案 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