Php 从多个表中选择行的最佳方法是什么?

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

我正在创建一个php应用程序,现在正在创建DB接口代码。在我的应用程序中,它们有三个表:用户、网络、用户和网络。它们具有以下特性:

  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语句中实现: