如何分组GROUP_CONCAT()?

时间:2018-12-09 12:45:47

标签: 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 = 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

是否可以在当前查询中实现?

更新:表结构

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连接和分隔的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 :(得分: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

答案 1 :(得分: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