![](/img/trans.png)
[英]Select points within polygon mysql - No errors, no results-(What is wrong?)
[英]Show matched results with WHERE IN() first then other results- MYSQL
我有以下表格:
用户
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
子句以获得所需的结果。 谢谢。
我认为您只想order by
以下方式调整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
我想您不想对每个用户的收藏夹进行硬编码。
如果您希望user_id = 1
的结果并搜索以'Ab'
开头的title
:
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
观看演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.