簡體   English   中英

MySQL 多個 ORDER BY 條件,每個條件都有限制

[英]MySQL multiple ORDER BY conditions with limit for each condition

我有具有以下字段的實體Product (映射到表product ):

  • createdAt(創建日期)
  • numberOfLikes(收到的贊數)
  • numberOfComments(收到的評論數)

我需要創建一個分頁儀表板,每頁有 20 個元素(並且沒有重復)。 現在我正在做 3 個不同的查詢來提取,然后將以下項目組合在一個列表中:

  • 前 10 名最新產品(ORDER BY createdAt DESC)
  • 最喜歡的前 5 個產品(按 numberOfLikes DESC 排序)<== 我手動從第一個查詢中排除 ID,其中WHERE id NOT IN
  • 前 5 個評論最多的產品(按 numberOfComments DESC 排序)<== 我手動從第一個和第二個查詢中排除 ID,其中WHERE id NOT IN

我想創建一個查詢來提取所有 20 個以前的項目。 可能嗎?

我正在使用 MySQL 和 Doctrine (Symfony),我會對一個與Doctrine 兼容的解決方案感興趣。

我認為不可能在單個查詢中完成。 如果總帖子的數量有限(比如儀表板中只有 100 個帖子可見),我會使用數組方法的組合。

這需要使用UNION ,這意味着您不能擁有與 Doctrine 兼容的解決方案。

核心方法與您在應用程序級別所做的相同,只是更丑。 要獲得完全相同的行為,您必須執行類似的操作

SELECT [text of first query]
UNION
SELECT [text of second query]
WHERE `id` NOT IN (
  SELECT `id` FROM (SELECT [text of first query])
)
UNION
SELECT [text of third query]
WHERE `id` NOT IN (
  SELECT `id` FROM (SELECT [text of first query])
)
AND `id` NOT IN (
  SELECT (SELECT `id` FROM [text of second query])
)

這意味着第一個查詢獨立執行了三次,第二個查詢執行了兩次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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