Лучший способ выбрать строки из нескольких таблиц? - PullRequest
0 голосов
/ 14 апреля 2011

Я создаю приложение php и сейчас создаю код интерфейса БД.В моем приложении их три таблицы, user, network, user_network.Они имеют следующий столбец:

  user<-------------------->user_network<-------------------->network
user_ID                       un_ID                            network_ID
user_Name                     un_Member                        network_Name
                              un_Network                       network_Description

Я создал следующий запрос, который запрашивает таблицу user_network и возвращает идентификаторы всех сетей, членом которых является пользователь:

$STH = $DBH->query("SELECT * FROM user_network WHERE nm_Member ='$userID'");

Затем я извлекаю идентификаторы сети из этого массива, используя следующий код:

$DB_NetworkID = array();
foreach($STH as $row)
{
    $DB_NetworkID[$counter] = $row['nm_networkID'];
    $counter++;
}
print_r($DB_NetworkID);

Массив теперь содержит все идентификаторы сети, членом которых является пользователь, например

Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 )   //network IDs = 1, 3, 5, 7

Теперь я хотел бы извлечь строки из сетевых таблиц. Как мне выбрать элементы из базы данных сетей, ГДЕ содержится идентификатор в массиве?

Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

Вместо этого вы должны использовать JOIN и сделать его одним запросом:

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'

Этот запрос предоставит вам все сети, членами которых является пользователь.

0 голосов
/ 27 апреля 2011

Конечно, использование JOIN, как сказал «Халфдан», - лучший способ. Но я отвечу на ваш вопрос:

Если ваш массив такой:

$ un = Array ([0] => 1 [1] => 3 [2] => 5 [3] => 7) // идентификаторы сети = 1, 3, 5, 7

Вы можете использовать Foreach так:

Foreach ($ un as $ key => $ value) {

и ваш запрос будет выглядеть так:

ВЫБРАТЬ * ИЗ сети, ГДЕ network_ID = '$ value'

0 голосов
/ 14 апреля 2011

Если ваша проблема заключается в сравнении с массивом, то простой обходной путь - это использование FIND_IN_SET(), например:

$list = implode(",", $DB_NetworkID);   // turns it into "1,3,5,7"

... "SELECT * FROM foo WHERE   FIND_IN_SET(network_ID, '$list')";

. Для повышения производительности вы должны создать предложение .. IN (?,?,..).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...