Php 从多个表中选择行的最佳方法是什么?
我正在创建一个php应用程序,现在正在创建DB接口代码。在我的应用程序中,它们有三个表:用户、网络、用户和网络。它们具有以下特性:Php 从多个表中选择行的最佳方法是什么?,php,mysql,sql,database,pdo,Php,Mysql,Sql,Database,Pdo,我正在创建一个php应用程序,现在正在创建DB接口代码。在我的应用程序中,它们有三个表:用户、网络、用户和网络。它们具有以下特性: user<-------------------->user_network<-------------------->network user_ID un_ID network_ID user_Name
user<-------------------->user_network<-------------------->network
user_ID un_ID network_ID
user_Name un_Member network_Name
un_Network network_Description
然后,我使用以下代码从此阵列中提取网络ID:
$DB_NetworkID = array();
foreach($STH as $row)
{
$DB_NetworkID[$counter] = $row['nm_networkID'];
$counter++;
}
print_r($DB_NetworkID);
该数组现在保存用户所属的所有网络ID,如下所示
Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 ) //network IDs = 1, 3, 5, 7
现在我想从networks表中提取行,如何从数组中包含ID的networks数据库中选择行
谢谢您的帮助。您应该改用联接,并将其作为单个查询:
SELECT
*
FROM
user
INNER JOIN
user_network
ON
user.user_ID = user_network.un_ID
INNER JOIN
network
ON
user_network.un_Network = network.network_ID
WHERE
user_ID = '$userID'
该查询将为您提供用户所属的所有网络。您应该使用联接,并将其作为单个查询:
SELECT
*
FROM
user
INNER JOIN
user_network
ON
user.user_ID = user_network.un_ID
INNER JOIN
network
ON
user_network.un_Network = network.network_ID
WHERE
user_ID = '$userID'
该查询将为您提供用户所属的所有网络。如果您的问题是与数组进行比较,那么一个简单的解决方法是使用
FIND_IN_SET()
,如下所示:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
为了获得更好的性能,您应该构造一个
。。但是,在(?,…)
子句中。如果您的问题是与数组进行比较,那么一个简单的解决方法是使用FIND_IN_SET()
如下:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
为了获得更好的性能,您应该构造一个
。。然而,在(?,…)
子句中。当然,如“halfdan”所说,使用JOIN
是最好的方法。
但我要回答你的问题:
如果您的阵列如下所示:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
$un=Array([0]=>1[1]=>3[2]=>5[3]=>7)//网络ID=1,3,5,7
您可以像这样使用Foreach
:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
Foreach($un作为$key=>$value){
您的查询将如下所示:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
从网络中选择*,其中网络ID=“$value”
当然,正如“哈夫丹”所说,使用
JOIN
是最好的方法。
但我要回答你的问题:
如果您的阵列如下所示:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
$un=Array([0]=>1[1]=>3[2]=>5[3]=>7)//网络ID=1,3,5,7
您可以像这样使用Foreach
:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
Foreach($un作为$key=>$value){
您的查询将如下所示:
$list = implode(",", $DB_NetworkID); // turns it into "1,3,5,7"
... "SELECT * FROM foo WHERE FIND_IN_SET(network_ID, '$list')";
从网络中选择*,其中网络ID=“$value”
如果需要用户所属的所有网络,可以使用联接在一条sql语句中实现:如果需要用户所属的所有网络,可以使用联接在一条sql语句中实现: