![](/img/trans.png)
[英]How do I return a single row as well as multple entries using group_concat in MySQL
[英]Return one single row with GROUP_CONCAT
我的查詢有問題,我想將所有會計數據組合在一起,並將客戶端站點名稱和站點 IP 分組為 GROUP_CONCAT。
我已經使用GROUP_CONCAT(site_name) as site_name
和GROUP_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)
我目前的結果如下:
您應該按非聚合列(而不是您在聚合函數中使用的列)分組,例如:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.