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
我没有能够得到这个工作。
亲切的问候 奈杰尔
如果您的数据库支持公用表表达式,那可能是一种方法。看到这个进一步的参考:https://stackoverflow.com/questions/4740748/when-to-use-common-table-expression-cte – REW
嗨,这是MYSQL。显然不支持公用表表达式。 感谢您的输入,但我学到了一些新东西:) – Nigel