【问题标题】:Show the first X results in Group Concat在 Group Concat 中显示前 X 个结果
【发布时间】:2021-11-01 17:50:32
【问题描述】:

我有一个查询返回所有者拥有的项目列表:

WITH all_items
AS
  (
         SELECT owner.id AS owner,
                item.title,
                item.importance
         FROM   owner
         JOIN   item
         ON     item.owner_id = owner.id)
  SELECT   owner.id,
           group_concat(DISTINCT item.title ORDER BY item.importance SEPARATOR ',')
  FROM     owner
  JOIN     all_items
  ON       all_items.owner = owner.id

我需要将 group_concat 限制为最多 6 个项目。我不能在 all_items 中执行 LIMIT,因为它只返回前 6 项,无论所有者是谁。我该怎么做?

【问题讨论】:

    标签: mysql limit group-concat


    【解决方案1】:

    最简单的方法是substring_index():

    substring_index(group_concat(DISTINCT item.title ORDER BY item.importance SEPARATOR ','), ',', 6)
    

    您的查询缺少GROUP BY 并且看起来过于复杂。我不知道你为什么要再次加入owner 表。事实上,你根本不需要加入它。为什么不直接使用这个?

    SELECT i.owner_id AS owner,
           group_concat(DISTINCT i.title ORDER BY i.importance SEPARATOR ',')
    FROM item i
    GROUP BY i.owner_id;
    

    您也可以使用不同的方法获得前六个:

    SELECT i.owner_id AS owner,
           group_concat(DISTINCT i.title ORDER BY i.importance SEPARATOR ',')
    FROM (SELECT i.*,
                 DENSE_RANK() OVER (PARTITION BY i.owner_id ORDER BY i.importance DESC, i.title) as seqnum
          FROM item i
         ) i
    WHERE seqnum <= 6
    GROUP BY i.owner_id;
    

    这样做的好处是,当所有者拥有数以万计的物品时,您不必担心GROUP_CONCAT() 字符串限制(假设标题不是很长)。

    【讨论】:

    • 嘿!非常感谢您的回答,第一部分对我帮助很大,我不记得了,它非常聪明!它如此复杂的原因是它只是更大事物的一部分,我对其进行了简化,以便我可以轻松地解释我到底需要什么。 TL;DR,主要所有者已参数化并从 20 多个表中获取数据,因此我将它们分块,以便能够在不破坏已经在运行的情况下进行未来的添加/修复。再次感谢!
    • 顺便说一下,R​​ANK对我来说完全陌生,但我看到很多人提到它,这个周末我一定会阅读更多关于它的内容,看起来超级有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2016-05-06
    • 2022-12-10
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多