繁体   English   中英

从另一个表联接SQL

[英]Joining from another table SQL

我需要使用以下代码将用户数据包加入IP记帐

SELECT ip_address, SUM(upload_bytes) as upload_bytes, SUM(download_bytes) as 
download_bytes 
FROM ((SELECT src_address as ip_address, SUM(bytes) AS upload_bytes, 0 as 
download_bytes
FROM ipaccounting
WHERE src_address BETWEEN ('192.168.0.1') AND ('192.168.255.254') AND 
dst_address NOT BETWEEN ('192.168.0.1') AND ('192.168.255.254') GROUP BY 
src_address)
UNION ALL (SELECT dst_address, 0 AS upload_bytes, SUM(bytes) as 
download_bytes 
FROM ipaccounting WHERE dst_address BETWEEN ('192.168.0.1') AND 
('192.168.255.254') AND src_address NOT BETWEEN ('192.168.0.1') AND 
('192.168.255.254') GROUP BY dst_address))
a GROUP BY ip_address 

我的SQL数据库有3个表:ipaccounting,用户和数据包。 每个数据包都有一个唯一的ID,该ID在users表的datapackage列中指定,而IP地址在users表中指定。

我需要加入用户数据包信息和IP地址,以便其回显:

IP地址 上传字节| 下载字节| 总字节数| 数据包ID | 用户名

我的整个代码:

<?php
//Include needed files
require ("config.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 
    FROM ((SELECT src_address as ip_address, SUM(bytes) AS upload_bytes, 0 
as download_bytes
    FROM ipaccounting
    WHERE src_address BETWEEN INET_NTOA($IPRangeStart) AND 
INET_NTOA($IPRangeEnd) AND dst_address NOT BETWEEN INET_NTOA($IPRangeStart) 
AND 
INET_NTOA($IPRangeEnd) GROUP BY src_address)
    UNION ALL (SELECT dst_address, 0 AS upload_bytes, SUM(bytes) as 
download_bytes FROM ipaccounting WHERE dst_address BETWEEN 
INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) AND src_address NOT 
BETWEEN 
INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) 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>
</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);




    echo "<tr><td>".$ip_address."</td><td>".$upload_bytes."</td>
<td>".$download_bytes."</td><td>".$total_bytes."</td></tr>";
} 

echo "</table>";
mysqli_close($conn);
?>

也许这样做可以:

SELECT ip_address, SUM(upload_bytes) as upload_bytes, SUM(download_bytes) as download_bytes, 
sum(upload_bytes + download_bytes) as totalbytes, datapackage_id, username 
FROM 
(
   (SELECT ipaccounting.src_address as ip_address, SUM(ipaccounting.bytes) AS upload_bytes, 0 as download_bytes, 
    user.username, datapackages.datapackage_id
    FROM ipaccounting
    inner join user on user.ipaddress = ipaccounting.src_address
    inner join datapackages on datapackages.datapackage_id = user.datapackageid
    WHERE src_address BETWEEN INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) 
    AND dst_address NOT BETWEEN INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) 
    GROUP BY src_address)
UNION ALL 
   (SELECT ipaccounting.dst_address as ip_address, 0 AS upload_bytes, SUM(ipaccounting.bytes) as download_bytes, 
    user.username, datapackages.datapackage_id
    FROM ipaccounting 
    inner join user on user.ipaddress = ipaccounting.dst_address
    inner join datapackages on datapackages.datapackage_id = user.datapackageid
    WHERE dst_address BETWEEN INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) 
    AND src_address NOT BETWEEN INET_NTOA($IPRangeStart) AND INET_NTOA($IPRangeEnd) 
    GROUP BY dst_address)
) a 
GROUP BY ip_address 
ORDER BY INET_ATON(ip_address)

您可能需要调整一些列名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM