【问题标题】:Select All on join query SQL连接查询 SQL 时全选
【发布时间】:2018-02-19 12:13:58
【问题描述】:

是否可以从连接查询中全选,我想从属于用户的数据包表中回显所有数据,而不是连接每一列?

这是我的 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 地址 |上传 |下载 |总计 |门槛 |下载速度 |上传速度 |数据限制

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    不记得这是否是我很久以前提出的问题的正确答案,但如果我记得正确,我正在寻找的答案类似于:

    SELECT 
        devices.*, 
        device_info.* 
    FROM devices
    LEFT JOIN device_info ON devices.id = device_info.device_id
    

    【讨论】:

      【解决方案2】:

      试试这个

      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
      • 那是因为 ipaccounting.src_address != NULL 条件总是为真,你必须根据你的数据集改变它。当 dst_address 有一些值时,我假设 src_address 为 NULL。
      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 2011-04-13
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多