簡體   English   中英

先顯示與WHERE IN()匹配的結果,然后再顯示其他結果-MYSQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM