首页 文章

如何GROUP GROUP_CONCAT()?

提问于
浏览
-1

我正在寻找一种方法来获取GROUP_CONCAT()函数的组在一个查询中,例如 .

我目前的代码

SELECT
    SUBSTRING_INDEX(GROUP_CONCAT(service_info.ip_address SEPARATOR ','),',',service_plans.aggregation) AS ip_address
FROM
    services
LEFT JOIN
    service_info
ON
    service_info.service_id = services.id
LEFT JOIN
    service_plans
ON
    service_plans.id = services.service_plan_id
WHERE
    service_plans.id = '2'

我想按特定的数字(如果你在查询中看到$ group_by变量)对IP地址进行分组,然后用不同的字符分隔,例如“:”或其他东西 .

基本上我希望我的输出看起来像:

如果$ group_by = 2:10.1.1.2,10.1.1.3:10.1.1.4,10.1.1.5

如果$ group_by = 3:10.1.1.2,10.1.1.3,10.1.1.4:10.1.1.5

这可以实现到我当前的查询中吗?

UPDATE: 表结构

service_plans id | name | aggregation ----------------------------------------- 1 | Uncapped 10Mbps 20:1 | 20 2 | Uncapped 20Mbps 10:1 | 10 3 | Capped 30Mbps | 0

services id | service_plan_id | description ------------------------------------ 1 | 2 | Phone 2 | 2 | Laptop 3 | 2 | PC 4 | 2 | TV 5 | 2 | Test

service_info id | service_id | ip_address ------------------------------ 1 | 1 | 10.1.1.2 2 | 2 | 10.1.1.3 3 | 3 | 10.1.1.4 4 | 4 | 10.1.1.5 5 | 5 | 10.1.1.6

我试图得到一个ip_address的数组连接并用逗号分隔,但是 service_plans.aggregation 值的多个组是 .

如果聚合为2,那么我的输出应该是:10.1.1.2,10.1.1.3:10.1.1.4,10.1.1.5如你所见,它们是2的组,然后下一组用冒号(:)分隔

如果聚合为3,那么我的输出应该是:10.1.1.2,10.1.1.3,10.1.1.4:10.1.1.5如你所见,它们是3组,然后下一组用冒号(:)分隔等等

2 回答

  • 0

    你的帖子有点混乱 . 如果您发布了示例数据,然后发布了您希望查询返回的内容,那将会有所帮助 . 根据您帖子的主题,我会根据您的想法给出答案 .

    ServicePlanIPs

    service_plan_id | ip_address
    -------------------------------
     1              | 192.168.70.1
     1              | 192.168.70.2
     1              | 192.168.70.3
     2              | 192.168.70.4
     2              | 192.168.70.5
     2              | 192.168.70.6
    

    如果对ServicePlanIPs运行此查询:

    SELECT service_plan_id, GROUP_CONCAT(ip_address) as ip_addresses
    FROM ServicePlanIPs
    GROUP BY service_plan_id
    

    你会得到:

    service_plan_id | ip_addresses
    -------------------------------
     1              | 192.168.70.1, 192.168.70.2, 192.168.70.3
     2              | 192.168.70.4, 192.168.70.5, 192.168.70.6
    
  • 0

    我不保证这会开箱即用,但它应该让你走在正确的轨道上 . 希望能帮助到你 . 注意 - 如果您使用的是支持窗口函数的mysql版本,您可以执行类似下面的操作,并使用本机支持的RANK函数,而不是使用变量手动执行 .

    SET @curRank := 0;
    SET @concatIps := '';
    
    SELECT 
    sp.id,
    @curRank := @curRank + 1 AS rank,
    IF(MOD(@curRank, (SELECT aggregation FROM service_plans WHERE id = {service_plan_id}) = 0, @concatIps := CONCAT(@concatIps, ':', s.ip_address), @concatIps := CONCAT(@concatIps, ',', s.ip_address)) 
    FROM service_plans sp 
    JOIN services s
        ON sp.id = s.service_plan_id
    JOIN service_info si
        ON si.service_id = s.id
    WHERE sp.id = {service_plan_id}
    ORDER BY service_info_id
    

相关问题