如何对group\u concat()进行分组?

hivapdat  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(424)

例如,我正在寻找一种在单个查询中获取group\u 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\ U by变量)对ip地址进行分组,然后用一个不同的字符分隔,比如“:”或其他什么。
本质上,我希望我的输出看起来像:
如果$group\ U by=2:10.1.1.2,10.1.1.3:10.1.1.4,10.1.1.5
如果$group\ U by=3:10.1.1.2,10.1.1.3,10.1.1.4:10.1.1.5
这是否可以实现到我当前的查询中?
更新:表结构

service_plans `id | name | aggregation

gxwragnw

gxwragnw1#

------ 1 | 2 | Phone 2 | 2 | Laptop 3 | 2 | PC 4 | 2 | TV 5 | 2 | Test表 service_infoid | service_id | ip_address

c86crjj0

c86crjj02#

  • 1 | Uncapped 10Mbps 20:1 | 20 2 | Uncapped 20Mbps 10:1 | 10 3 | Capped 30Mbps | 0表 servicesid | service_plan_id | description
7uhlpewt

7uhlpewt3#

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地址的串联和逗号分隔,但在一组的多少service_plans.aggregation` 价值是。
如果aggregation是2,那么我的输出应该是:10.1.1.2,10.1.1.3:10.1.1.4,10.1.1.5,正如您所看到的,它们是以2为一组的,然后下一组用冒号(:)分隔
如果aggregation是3,那么我的输出应该是:10.1.1.2,10.1.1.3,10.1.1.4:10.1.1.5,正如您所看到的,它们以3为一组,然后下一组用冒号(:)隔开,依此类推

qlfbtfca

qlfbtfca4#

你的帖子有点混乱。如果您发布了示例数据,然后发布了希望查询返回的内容,则会很有帮助。我会根据你帖子的主题回答你的问题。
服务计划

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
hmae6n7t

hmae6n7t5#

我不能保证这会用完的盒子,但它应该让你在正确的轨道上。希望有帮助。注意-如果您使用的是支持窗口函数的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

相关问题