mysql - 使用 GROUP_CONCAT 返回一行

标签 mysql sql

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

我使用了 GROUP_CONCAT(site_name) as site_nameGROUP_CONCAT(site_ip) as site_ip 但我得到的结果仍然不正确,我在 GROUP_CONCAT 中得到了重复的 IP专栏。

我需要每个客户的单行数据,其中包含属于他们的每个站点 IP 的统计流量 SUM/Grouped。

我的查询是:

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)

我目前的结果是这样的:

enter image description here enter image description here

最佳答案

你应该按非聚合列分组(而不是你在聚合函数中使用的列)例如:

  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

关于mysql - 使用 GROUP_CONCAT 返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47980741/

相关文章:

sql - PostgreSQL如何获取同一列多个值的最新记录?

php - 将两个字段合并在一起用作一个表中的复合键,但在另一个表中用作外键?

php - 数据表过滤器显示重复行

mysql - SQL 连接表较低的日期和较低的 ID

java - 无法连接本地mysql服务器

sql - 帮助进行 SQL 查询

mysql - SQL多选case语句

php - 使用php从mysql数据库导出一个csv文件

MySQL Order by Rand() 在结果顶部

sql - 测试使用并返回 refcursor 的 PostgreSQL 函数