Php 如何对组_CONCAT()进行分组?

Php 如何对组_CONCAT()进行分组?,php,mysql,Php,Mysql,例如,我正在寻找一种在单个查询中获取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 = s

例如,我正在寻找一种在单个查询中获取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

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

更新:表格结构

服务计划


id |名称|聚合
-----------------------------------------
1 |无上限10Mbps 20:1 | 20
2 |无上限20Mbps 10:1 | 10
3 |上限30Mbps | 0

服务

id |服务|计划| id |说明
------------------------------------
1 | 2 |电话
2 | 2 |笔记本电脑
3 | 2 |个人电脑
4 | 2 |电视
5 | 2 |试验

服务信息


id |服务| id | ip |地址
------------------------------
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地址数组,该数组用逗号连接和分隔,但不管
服务计划有多大,它都是成组的。聚合值是

如果聚合为2,则我的输出应为: 10.1.1.2,10.1.1.3:10.1.1.4,10.1.1.5 正如您所看到的,它们分为两组,然后下一组由冒号(:)分隔

如果聚合为3,则我的输出应为: 10.1.1.2,10.1.1.3,10.1.1.4:10.1.1.5
如你所见,他们是3人一组,然后下一组用冒号(:)隔开,以此类推,你的帖子有点让人困惑。如果您发布了示例数据,然后发布了您希望查询返回的内容,这将非常有用。我会根据你文章的主题,回答你的问题

服务计划

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

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

我已经更新了我的问题,希望这能帮助你更好地理解我在寻找什么?