Mysql 返回一个包含组_CONCAT的单行

Mysql 返回一个包含组_CONCAT的单行,mysql,sql,Mysql,Sql,我的查询有问题,我想将所有会计数据分组在一起,并对客户的站点名称和站点IP进行分组 我使用了GROUP_CONCAT(site_name)作为site_name和GROUP_CONCAT(site_ip)作为site_ip,但我得到的结果仍然不正确,并且在GROUP_CONCAT列中得到了重复的ip 我需要为每个客户机提供一行数据,其中包含属于他们的每个站点IP的计算流量总和/分组 我的问题是: SELECT SUM(upload_bytes) as upload_bytes, SUM(do

我的查询有问题,我想将所有会计数据分组在一起,并对客户的站点名称和站点IP进行分组

我使用了
GROUP_CONCAT(site_name)作为site_name
GROUP_CONCAT(site_ip)作为site_ip
,但我得到的结果仍然不正确,并且在GROUP_CONCAT列中得到了重复的ip

我需要为每个客户机提供一行数据,其中包含属于他们的每个站点IP的计算流量总和/分组

我的问题是:

SELECT 
SUM(upload_bytes) as upload_bytes, 
SUM(download_bytes) as download_bytes, 
SUM(upload_bytes + download_bytes) as totalbytes, 
package_id, 
username, 
userid, 
networkaccess, 
packagename, 
speedlimit, 
threshold, 
throttlelimit, 
extendeddata, 
datalimitamount, 
accountingdays, 
GROUP_CONCAT(site_name) as site_name, 
GROUP_CONCAT(site_ip) as site_ip 
FROM 
(
    (
        SELECT 
            ip_accounting.src_address as site_ip, 
            SUM(ip_accounting.bytes) AS upload_bytes, 
            0 as download_bytes, 
            clients.username, 
            clients.userid, 
            clients.networkaccess, 
            clients.extendeddata, 
            data_packages.package_id, 
            data_packages.packagename, 
            data_packages.speedlimit, 
            data_packages.threshold, 
            data_packages.throttlelimit, 
            data_packages.datalimitamount, 
            data_packages.accountingdays, 
            client_site_ip.site_name 
        FROM 
            ip_accounting 
            join client_site_ip on client_site_ip.site_ip = ip_accounting.src_address 
            JOIN clients ON client_site_ip.userid = clients.userid 
            join data_packages on data_packages.package_id = clients.datapackage 
        WHERE 
            dst_address NOT BETWEEN INET_NTOA('192.168.0.1') 
            AND INET_NTOA('192.168.255.254') 
            and timeanddate BETWEEN SUBDATE(
                CURRENT_TIMESTAMP(), 
                INTERVAL data_packages.accountingdays DAY
            ) 
            AND CURRENT_TIMESTAMP() 
        GROUP BY 
            src_address
    ) 
    UNION ALL 
        (
            SELECT 
                ip_accounting.dst_address as site_ip, 
                0 AS upload_bytes, 
                SUM(ip_accounting.bytes) as download_bytes, 
                clients.username, 
                clients.userid, 
                clients.networkaccess, 
                clients.extendeddata, 
                data_packages.package_id, 
                data_packages.packagename, 
                data_packages.speedlimit, 
                data_packages.threshold, 
                data_packages.throttlelimit, 
                data_packages.datalimitamount, 
                data_packages.accountingdays, 
                client_site_ip.site_name 
            FROM 
                ip_accounting 
                join client_site_ip on client_site_ip.site_ip = ip_accounting.dst_address 
                JOIN clients ON client_site_ip.userid = clients.userid 
                join data_packages on data_packages.package_id = clients.datapackage 
            WHERE 
                src_address NOT BETWEEN INET_NTOA('192.168.0.1') 
                AND INET_NTOA('192.168.255.254') 
                and timeanddate BETWEEN SUBDATE(
                    CURRENT_TIMESTAMP(), 
                    INTERVAL data_packages.accountingdays DAY
                ) 
                AND CURRENT_TIMESTAMP() 
            GROUP BY 
                dst_address
        )
) a 
GROUP BY 
site_ip 
ORDER BY 
INET_ATON(site_ip)
我当前的结果如下所示:


您应该按照非聚合列(而不是聚合函数中使用的列)进行分组,例如:


我看得出你不明白我的意思。。。因为您误用了MySQL的GROUP BY方法,这将导致无效结果。。我建议你们阅读这篇()的旧文章,但它至今仍然有效。我现在更困惑了。如果我删除组_CONCAT,一切正常,但随后返回多个行,每个客户机具有相同的数据,但具有不同的站点信息,如带宽使用情况、站点名称、站点IP等。我想做的就是合并这些行,并为
站点名称
站点ip
列提供逗号,以及属于每个客户端的每个站点的所有带宽使用量之和。如果你说我不正确地使用GROUP BY,那么你能告诉我应该做什么吗如果没有示例数据和预期输出,这很难说。我刚刚说了我的预期输出需要是什么:我想做的就是合并行,并为site_name和site_ip列提供逗号,以及属于每个客户端的每个站点的所有带宽使用量之和,但当您提供示例数据。。我们不是来对您的SQL查询进行反向工程的。我仍然在结果中获得重复的
站点名称
站点IP
“我仍然在结果中获得重复的站点名称和站点IP”,您可以在函数组中使用DISTINCT。。像这样
GROUP\u CONCAT(不同的站点名称)作为站点名称
  SELECT 
  SUM(upload_bytes) as upload_bytes, 
  SUM(download_bytes) as download_bytes, 
  SUM(upload_bytes + download_bytes) as totalbytes, 
  package_id, 
  username, 
  userid, 
  networkaccess, 
  packagename, 
  speedlimit, 
  threshold, 
  throttlelimit, 
  extendeddata, 
  datalimitamount, 
  accountingdays, 
  GROUP_CONCAT(DISTINCT site_name) as site_name, 
  GROUP_CONCAT(DISTINCT site_ip) as site_ip 
  FROM 
  (
      (
          SELECT 
              ip_accounting.src_address as site_ip, 
              SUM(ip_accounting.bytes) AS upload_bytes, 
              0 as download_bytes, 
              clients.username, 
              clients.userid, 
              clients.networkaccess, 
              clients.extendeddata, 
              data_packages.package_id, 
              data_packages.packagename, 
              data_packages.speedlimit, 
              data_packages.threshold, 
              data_packages.throttlelimit, 
              data_packages.datalimitamount, 
              data_packages.accountingdays, 
              client_site_ip.site_name 
          FROM 
              ip_accounting 
              join client_site_ip on client_site_ip.site_ip = ip_accounting.src_address 
              JOIN clients ON client_site_ip.userid = clients.userid 
              join data_packages on data_packages.package_id = clients.datapackage 
          WHERE 
              dst_address NOT BETWEEN INET_NTOA('192.168.0.1') 
              AND INET_NTOA('192.168.255.254') 
              and timeanddate BETWEEN SUBDATE(
                  CURRENT_TIMESTAMP(), 
                  INTERVAL data_packages.accountingdays DAY
              ) 
              AND CURRENT_TIMESTAMP() 
          GROUP BY 
              src_address
      ) 
      UNION ALL 
          (
              SELECT 
                  ip_accounting.dst_address as site_ip, 
                  0 AS upload_bytes, 
                  SUM(ip_accounting.bytes) as download_bytes, 
                  clients.username, 
                  clients.userid, 
                  clients.networkaccess, 
                  clients.extendeddata, 
                  data_packages.package_id, 
                  data_packages.packagename, 
                  data_packages.speedlimit, 
                  data_packages.threshold, 
                  data_packages.throttlelimit, 
                  data_packages.datalimitamount, 
                  data_packages.accountingdays, 
                  client_site_ip.site_name 
              FROM 
                  ip_accounting 
                  join client_site_ip on client_site_ip.site_ip = ip_accounting.dst_address 
                  JOIN clients ON client_site_ip.userid = clients.userid 
                  join data_packages on data_packages.package_id = clients.datapackage 
              WHERE 
                  src_address NOT BETWEEN INET_NTOA('192.168.0.1') 
                  AND INET_NTOA('192.168.255.254') 
                  and timeanddate BETWEEN SUBDATE(
                      CURRENT_TIMESTAMP(), 
                      INTERVAL data_packages.accountingdays DAY
                  ) 
                  AND CURRENT_TIMESTAMP() 
              GROUP BY 
                  dst_address
          )
  ) a 
  GROUP BY 
      package_id, 
      username, 
      userid, 
      networkaccess, 
      packagename, 
      speedlimit, 
      threshold, 
      throttlelimit, 
      extendeddata, 
      datalimitamount, 
      accountingdays