2017-09-11 83 views
2

是否有可能從連接查詢中選擇所有,我想從屬於用戶的datapackages表中的所有數據進行回顯,而不是加入每個列?選擇所有加入查詢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

試試這個

SELECT ip_address, 
SUM(IF(ipaccounting.src_address != NULL, ipaccounting.bytes, 0)) as upload_bytes, 
SUM(IF(ipaccounting.dst_address != NULL, ipaccounting.bytes, 0)) as download_bytes, 
sum(ipaccounting.bytes) as totalbytes, 
package_id, username 
FROM ipaccounting 
join users on users.ipaddress = ipaccounting.src_address OR users.ipaddress = ipaccounting.dst_address 
join datapackages on datapackages.package_id = users.datapackage 
WHERE ipaccounting.dst_address NOT BETWEEN INET_NTOA('192.168.0.1') AND INET_NTOA('192.168.255.254') 
AND ipaccounting.src_address NOT BETWEEN INET_NTOA('192.168.0.1') AND INET_NTOA('192.168.255.254') 
GROUP BY src_address,dst_address ORDER BY INET_ATON(src_address),INET_ATON(dst_address) 

爲了更準確的查詢請郵寄表結構和樣本數據。

+0

這並不回答我的問題,也沒有幫助我,如果我測試你提供的查詢,然後我得到上傳字節0和下載字節0 –

+0

這是因爲ipaccounting.src_address!= NULL條件總是如此,你必須根據你的數據集來改變它。我認爲當dst_address有一些值時,src_address是NULL。 –