2
結合クエリからすべてを選択できますか?各列を結合するのではなく、ユーザーに属するデータパッケージテーブルのすべてのデータをエコーアウトしますか?ここで結合クエリですべてを選択SQL
は私のSQLクエリは次のとおりです。
SELECT ip_address, SUM(upload_bytes) as upload_bytes, SUM(download_bytes) as
download_bytes,
sum(upload_bytes + download_bytes) as totalbytes, package_id,
username
FROM
(
(SELECT ipaccounting.src_address as ip_address,
SUM(ipaccounting.bytes) AS upload_bytes, 0 as download_bytes,
users.username, datapackages.package_id
FROM ipaccounting
join users on users.ipaddress = ipaccounting.src_address
join datapackages on datapackages.package_id = users.datapackage
WHERE dst_address NOT BETWEEN INET_NTOA('192.168.0.1') AND
INET_NTOA('192.168.255.254')
GROUP BY src_address)
UNION ALL
(SELECT ipaccounting.dst_address as ip_address, 0 AS
upload_bytes, SUM(ipaccounting.bytes) as download_bytes,
users.username, datapackages.package_id
FROM ipaccounting
join users on users.ipaddress = ipaccounting.dst_address
join datapackages on datapackages.package_id = users.datapackage
WHERE src_address NOT BETWEEN INET_NTOA('192.168.0.1') AND
INET_NTOA('192.168.255.254')
GROUP BY dst_address)
) a
GROUP BY ip_address
ORDER BY INET_ATON(ip_address)
私の完全なコード:
<?php
//Include needed files
require ("config.php");
require ("includes/routeros_api.class.php");
include ("includes/formatbytes.php");
//Connect to database
$conn = mysqli_connect($SQLserver, $SQLusername, $SQLpassword,
$SQLdatabase);
if (!$conn) {
die("Could not connect: " . mysqli_connect_error());
}
//Convert IP Addresses
$IPRangeStart = ip2long($IPRangeStart);
$IPRangeEnd = ip2long($IPRangeEnd);
//Query database
$query = "
SELECT ip_address, SUM(upload_bytes) as upload_bytes,
SUM(download_bytes) as download_bytes,
sum(upload_bytes + download_bytes) as totalbytes, package_id,
username
FROM
(
(SELECT ipaccounting.src_address as ip_address,
SUM(ipaccounting.bytes) AS upload_bytes, 0 as download_bytes,
users.username, datapackages.package_id
FROM ipaccounting
join users on users.ipaddress = ipaccounting.src_address
join datapackages on datapackages.package_id = users.datapackage
WHERE dst_address NOT BETWEEN INET_NTOA('192.168.0.1') AND
INET_NTOA('192.168.255.254')
GROUP BY src_address)
UNION ALL
(SELECT ipaccounting.dst_address as ip_address, 0 AS
upload_bytes, SUM(ipaccounting.bytes) as download_bytes,
users.username, datapackages.package_id
FROM ipaccounting
join users on users.ipaddress = ipaccounting.dst_address
join datapackages on datapackages.package_id = users.datapackage
WHERE src_address NOT BETWEEN INET_NTOA('192.168.0.1') AND
INET_NTOA('192.168.255.254')
GROUP BY dst_address)
) a
GROUP BY ip_address
ORDER BY INET_ATON(ip_address)
";
//Execute query
$result = mysqli_query($conn,$query);
//Display IP information
echo "<table>";
echo "<tr><th>IP Address</th><th>Upload</th><th>Download</th><th>Total</th>
<th>Username</th><th>Data Package</th></tr>";
while($row = mysqli_fetch_array($result)) {
$ip_address = $row['ip_address'];
$upload_bytes = $row['upload_bytes'];
$download_bytes = $row['download_bytes'];
$total_bytes = ($upload_bytes + $download_bytes);
$total_bytes = formatBytes($total_bytes);
$upload_bytes = formatBytes($upload_bytes);
$download_bytes = formatBytes($download_bytes);
$username = $row['username'];
$datapackage = $row['package_id'];
echo "<tr><td>".$ip_address."</td><td>".$upload_bytes."</td>
<td>".$download_bytes."</td><td>".$total_bytes."</td><td>".$username."</td>
<td>".$datapackage."</td</tr>";
//API MikroTik
/*$API = new RouterosAPI();
$API->debug = true;
if ($API->connect($RouterIP, $APIusername, $APIpassword)) {
$API->comm("/queue/simple/add", array(
"target-address="=> "10.10.10.16");
$API->disconnect();
}*/
}
echo "</table>";
mysqli_close($conn);
?>
私はIPアドレスをエコーする必要があります|アップロード|ダウンロード|合計|しきい値|ダウンロード速度|アップロード速度|データリミット
これは私の質問に答えるものではありません。あなたが提供したクエリをテストすると、アップロードバイト0とダウンロードバイト0が得られます –
これはipaccounting.src_address!= NULL条件が常にtrueのためですあなたのデータセットに従ってそれを変更する必要があります。 dst_addressにある値があると、src_addressがNULLであると仮定しました。 –