繁体   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