【问题标题】:MySQL multiple ORDER BY conditions with limit for each conditionMySQL 多个 ORDER BY 条件,每个条件都有限制
【发布时间】:2020-07-13 14:33:43
【问题描述】:

我有实体Product(映射到表product)具有以下字段:

  • createdAt(创建日期)
  • numberOfLikes(收到的赞数)
  • numberOfComments(收到的 cmets 数)

我需要创建一个分页仪表板,其中包含 每页 20 个元素(并且没有重复)。现在我正在做 3 个不同的查询来提取,然后将以下项目组合到一个列表中:

  • 前 10 名最新产品(ORDER BY createdAt DESC)
  • 前 5 个最喜欢的产品(按 numberOfLikes DESC 排序)WHERE id NOT IN
  • 评论最多的前 5 个产品(按 numberOfComments DESC 排序)WHERE id NOT IN 手动排除第一个和第二个查询中的 ID

我想创建一个查询来提取所有 20 个以前的项目。有可能吗?

我正在将 MySQL 与 Doctrine (Symfony) 一起使用,并且我会对 Doctrine 兼容的解决方案感兴趣。

【问题讨论】:

  • 您是否尝试过使用UNION(不确定 Doctrine 是否支持)。
  • 不幸的是,Doctrine 不支持 UNION 运算符,但这不是主要问题。如果第二个列表包含第一个列表中的元素,UNION 是否不会删除重复项,因此总共少于 20 个项目?谢谢@NigelRen!
  • 您同时拥有 UNION DISTINCT 和 UNION ALL。
  • 但是使用 UNION DISTINCT 我会有少于 20 个项目,使用 UNION ALL 我会有重复项,对吗?我想要 20 件商品,但不能重复。
  • ' 如果第二个列表包含第一个列表中的元素,' - 如果您仍然使用 not in..(或不存在)会发生这种情况。

标签: php mysql doctrine


【解决方案1】:

我认为不可能在单个查询中完成。如果帖子总数有限(比如仪表板中只有 100 个帖子可见),我会使用数组方法的组合。

【讨论】:

    【解决方案2】:

    这需要使用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])
    )
    

    这意味着第一个查询被独立执行了 3 次,而第二个查询被执行了两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2017-07-10
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多