分组可排序天时从 group_concat 中选择第一行和最后一行

Posted

技术标签:

【中文标题】分组可排序天时从 group_concat 中选择第一行和最后一行【英文标题】:Select first and last row from group_concat when grouping sortable days 【发布时间】:2012-06-01 01:23:01 【问题描述】:

参考我之前关于组 concat 的问题 mysql again, group by and display rest of rows

我需要从该查询中获取第一天和最后一天

例如

row 3 from 8,9,10 to first collumn 8, last collumn 10
row 5 from 21,22,23,24,28,29,30 to first collumn 21, last collumn 30
row 6 from 17,21,22,23,24,25 to first collumn 17 last collumn 25

SUBSTR(GROUP_CONCAT(DAY),-1) as fl

但它给了我最后一个字符,例如,很少有 1 或 2 个字符的行

1,2,3,22
1,3,6,3

在第一个示例中,它给了我 2,而不是 22:/

【问题讨论】:

【参考方案1】:

另一个选择(除了迈克尔的解决方案)是使用 SUBSTRING_INDEX:

SUBSTRING_INDEX(str,delim,count)

count = 1

你得到了第一天,

count=-1

你得到最后一个

【讨论】:

这行得通,我感谢你。但是,我不敢相信没有连接和字符串然后拆分它就没有办法做到这一点。对于在某个时候已经是数组的东西,这是很多字符串操作。【参考方案2】:

不要浪费时间尝试解析GROUP_CONCAT() 的第一个和最后一个。相反,只需将MIN()MAX()CONCAT() 一起粘贴即可。

SELECT 
  user,
  CONCAT(MIN(DAY)), ',', MAX(DAY)) AS f1
FROM yourtable
GROUP BY user

【讨论】:

最小和最大的行为是否像“第一个”和“最后一个”一样,还是像他们的名字听起来一样? @Jus12 它们是the aggregate MIN()/MAX(),所以它们听起来是每个user 组的最小值和最大值。 我喜欢这个,但是如果数据按日期排列并且问题似乎更通用“从组 concat 中选择第一行和最后一行”,则解决方案非常具体。理想情况下,应该有一种方法可以选择第一个和最后一个元素而不进行排序。有这样的吗? 否,除了在另一个答案中对连接执行字符串操作。因为每个SELECT 级别的每个组只应用一次聚合函数,所以要获得第一个或最后一个,您需要一些额外的聚合,将其包装在子查询中以检索最小/最大值,或对ORDER BY/LIMIT 的子查询并仅提取一个排。所有这些解决方案都很丑陋。我将编辑问题标题,使其更具体地针对用例。 @Jus12 如果您正在寻找更通用的用例,您应该提出一个新问题

以上是关于分组可排序天时从 group_concat 中选择第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章

在分组之前排序[重复]

MySql的group_concat函数的使用

mysql 分组查询问题 group_concat

在带有函数的 MySQL GROUP_CONCAT 中排序

mysql分组合并语句

mysql group_concat函数详解