2015-12-22 164 views
2

我有一個查詢從多個表中查找數據。 其中一個值是設備IP地址。 我有一個子查詢使用這個IP地址,並搜索不同表中的IP地址範圍,並返回一個'vlan_id',如果它在該範圍內。 在設備表中 - ip地址字段被稱爲'ip_add'。 IP地址存儲爲16位無符號整數。嵌套子查詢搜索

代碼:

 SELECT DISTINCT *, 
        equipment.id AS id, 
        INET_NTOA(ip_add) AS ip_add_c, 
        INET_NTOA(mcast) AS mcast, 
        INET_NTOA(lookup) AS lookup, 
        list_systype.systype_label, 
        list_chgstatus.chgstatus_label 
    FROM `equipment` 
    LEFT JOIN itam_asset on equipment.itamname=itam_asset.ASSETID 
    LEFT JOIN dnslookup on equipment.itamname=dnslookup.itamname 
    LEFT JOIN list_systype on equipment.systype=list_systype.systype_value 
    LEFT JOIN list_chgstatus on itam_asset.ASSETLIFECYCLESTATUS=list_chgstatus.chgstatus_value  
    WHERE system_name LIKE :s_name_in 

//get results..... 
//Get equipment data 
//select and prepare 
$database->query($query); 
.. 
.. 


foreach($rows as $row){ 

//inside this loop I have a sub query that finds the vlan_id 

$query = "SELECT vlan_id FROM vlan_agg WHERE :ip_add >= ip_sub AND :ip_add <= bcast"; 
//Get equipment data 
//select and prepare 
$database->query($query); 
//Bind 
$database->bind(':ip_add',$ip_add); 
$rows1 = $database->resultset(); 
    //execute our query 
     $database->execute(); 

foreach($rows1 as $vl){ 

//extract row 

extract($vl); 
#print_r($vl); 
} 

//display results 
... 
... 
} 

以上嵌套查詢效果很好。 我的問題是可以將子查詢到主查詢(和應該怎麼做這個我看過,這是非常低效的?)

事情是這樣的:

 SELECT DISTINCT *, 
        equipment.id AS id, 
        INET_NTOA(ip_add) AS ip_add_c, 
        INET_NTOA(mcast) AS mcast, 
        INET_NTOA(lookup) AS lookup, 
        list_systype.systype_label, 
        list_chgstatus.chgstatus_label 
    FROM `equipment` 
    LEFT JOIN itam_asset on equipment.itamname=itam_asset.ASSETID 
    LEFT JOIN dnslookup on equipment.itamname=dnslookup.itamname 
    LEFT JOIN list_systype on equipment.systype=list_systype.systype_value 
    LEFT JOIN list_chgstatus on itam_asset.ASSETLIFECYCLESTATUS=list_chgstatus.chgstatus_value 

      IN (SELECT vlan_id FROM vlan_agg WHERE ip_add >= ip_sub AND ip_add <= bcast) 

WHERE system_name LIKE :s_name_in 

我沒有能夠得到這個工作。

親切的問候 奈傑爾

+0

如果您的數據庫支持公用表表達式,那可能是一種方法。看到這個進一步的參考:https://stackoverflow.com/questions/4740748/when-to-use-common-table-expression-cte – REW

+0

嗨,這是MYSQL。顯然不支持公用表表達式。 感謝您的輸入,但我學到了一些新東西:) – Nigel

回答

1

只需要添加另外LEFT JOIN到查詢。

SELECT DISTINCT *, 
    equipment.id AS id, 
    INET_NTOA(ip_add) AS ip_add_c, 
    INET_NTOA(mcast) AS mcast, 
    INET_NTOA(lookup) AS lookup, 
    list_systype.systype_label, 
    list_chgstatus.chgstatus_label, 
    vlan_id 
FROM `equipment` 
LEFT JOIN itam_asset on equipment.itamname=itam_asset.ASSETID 
LEFT JOIN dnslookup on equipment.itamname=dnslookup.itamname 
LEFT JOIN list_systype on equipment.systype=list_systype.systype_value 
LEFT JOIN list_chgstatus on itam_asset.ASSETLIFECYCLESTATUS=list_chgstatus.chgstatus_value  
LEFT JOIN vlan_agg ON ip_add BETWEEN ip_subAND bcast 
WHERE system_name LIKE :s_name_in 
+0

太簡單了!謝謝,這個作品很棒:) – Nigel