首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >首先用WHERE ()显示匹配的结果,然后显示其他结果- MYSQL

首先用WHERE ()显示匹配的结果,然后显示其他结果- MYSQL
EN

Stack Overflow用户
提问于 2019-03-02 12:00:10
回答 2查看 41关注 0票数 0

我有以下表格:

用户

代码语言:javascript
复制
id  | Name    | ...
1   | John    |
2   | Richard |
3   | Michael |

图书

代码语言:javascript
复制
id  | title | author| ...
1   | ABC   |  Z    |
2   | ABM   |  X    |
3   | IJK   |  W    |
4   | MNO   |  Z    |
5   | ABQ   |  Y    |

fav_book

代码语言:javascript
复制
user_id  | book_id
1        |   5   |  
1        |   4   | 
3        |   1   | 
3        |   2   | 
3        |   5   | 

现在,如果John搜索一本名为Ab的书,我想先在搜索结果中显示他最喜欢的一本书,然后是其他的。

因此,John搜索Ab的输出应该是

代码语言:javascript
复制
id  | title
5   | ABQ
1   | ABC
2   | ABM

我试过:

代码语言:javascript
复制
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子句以获得所需的结果。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-02 12:01:19

我想你只是想调整一下order by

代码语言:javascript
复制
SELECT id, title
FROM book 
WHERE title LIKE 'Ab%'
ORDER BY (id IN (5, 4)) DESC  -- put these first

在数值上下文中,MySQL将布尔值视为整数。"true“的值为1,"false”为0;这就是为什么将匹配的ids放在首位的原因。

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

代码语言:javascript
复制
ORDER BY (id IN (5, 4)) DESC,  -- put these first
         id
票数 2
EN

Stack Overflow用户

发布于 2019-03-02 12:17:12

我想您不想为每个用户硬编码fav书籍。

如果您想要user_id = 1的结果并搜索以'Ab'开头的title

代码语言:javascript
复制
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

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54958280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档