首页 > 解决方案 > 如何在 GROUP_CONCAT MySQL 选择中有条件分隔符

问题描述

我不知道这是否可以做到。在我的 MySQL 代码中,我的选择之一是:

GROUP_CONCAT(timestamp SEPARATOR '~') AS times

我想做的是测试时间戳在日期/小时/分钟级别是否相等,以及是否用 a<br> 而不是波浪号替换 SEPARATOR。有没有办法在 MySQL 中做到这一点?如果不是,我将如何在 PHP 中进行操作?最终结果需要是两个(或更多)时间戳组成一个字符串,它将在表格单元格中使用。如果日期/小时/分钟相等,那么两者都将在同一个单元格中。如果它有助于时间戳几乎肯定会在表中是连续的。

标签: phpmysql

解决方案


您通常会使用两个级别的聚合来做到这一点。首先按分钟聚合并group_concat使用<br>分隔符,然后再次使用~分隔符聚合生成的字符串。

假设一个名为mytable时间戳列的表称为mytimestamp,您将执行以下操作:

select group_concat(gc0 order by myminute separator '~') gc1
from (
    select 
        date_format(mytimestamp, '%Y-%m-%d %H:%i') myminute,
        group_concat(mytimestamp order by mytimestamp separator '<br>') gc0
    from mytable
    group by myminute
) t

DB Fiddle 上的演示

样本数据:

| 我的时间戳 |
| :----------------- |
| 2019-01-01 00:00:00 |
| 2019-01-01 00:00:01 |
| 2019-01-01 00:00:10 |
| 2019-01-01 00:01:00 |
| 2019-01-02 14:10:00 |
| 2019-01-02 14:10:30 |

查询结果:

| gc1 |
| :------------------------------------------------ -------------------------------------------------- ---------------------------------------- |
| 2019-01-01 00:00:00<br>2019-01-01 00:00:01<br>2019-01-01 00:00:10~2019-01-01 00:01:00~2019- 01-02 14:10:00<br>2019-01-02 14:10:30 |

推荐阅读