Mysql 返回一个包含组_CONCAT的单行
我的查询有问题,我想将所有会计数据分组在一起,并对客户的站点名称和站点IP进行分组 我使用了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
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