Как эффективно SQL-запрос дочерних записей из нескольких таблиц? - PullRequest
3 голосов
/ 19 февраля 2010

У нас есть простая база данных.Таблица User содержит пользователей.Таблица Accounts содержит несколько учетных записей для каждого пользователя.Таблица «Темы» содержит несколько тем для каждой учетной записи.

Таким образом, у пользователя будет несколько учетных записей, а у каждой учетной записи будет несколько тем.Итак, если у меня есть пользователь с id = 1, как мне эффективно запросить все 3 таблицы, чтобы получить все учетные записи и темы для этого пользователя?

В настоящее время я использую циклы foreach, которые выполняют много SQL-запросов.Есть ли способ просто запустить один SQL-запрос, чтобы получить то, что я хочу ??

Вот код, который я в настоящее время использую (который является кодом CodeIgniter):

$data=array();
$accounts=$this->db->get_where('accounts',array('user_id'=>1));
foreach ($accounts->result() as $account) {
    $tmp=array();
    $topics=$this->db->get_where('topics',array('account_id'=>$account->id));
    foreach ($topics->result() as $topic) {
        $this->db->order_by($order_by);
        $terms=$this->db->get_where('terms',array('topic_id'=>$topic->id));
        array_push($tmp,array('topic'=>$topic, 'terms'=>$terms->result()));
    }
    array_push($data,array('account'=>$account, 'topics'=>$tmp));
}
return $data;

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

Просто один ко многим с другим ко многим.

Пользователь-> Множество учетных записей

Аккаунт-> Многие темы

Подумайте о вашей таблице пользователей, что одна строка уникальна (содержит одного пользователя, скажем, Джон Доу). Представьте себе, что ваша таблица учетных записей ссылается на какого-то пользователя (то есть несколько учетных записей могут содержать одного и того же пользователя, кроме того, учетная запись Acme 1 и Acme 2 оба относятся к пользователю Jon Doe). Наконец, подумайте о таблице тем, содержащей ссылку на аккаунт. То есть каждая тема имеет идентификатор аккаунта. Это означает, что с аккаунтами связано много тем.

SELECT
   u.UserID,
   a.Account
   t.Topic
FROM 
    Users u
INNER JOIN 
     Accounts a
ON u.UserID = a.UserID
INNER JOIN
     Topics t
ON t.AccountID = a.AccountID

Если вы хотите сузить одного пользователя, просто добавьте предложение WHERE:

SELECT
   u.UserID,
   a.Account
   t.Topic
FROM 
    Users u
INNER JOIN 
     Accounts a
ON u.UserID = a.UserID
INNER JOIN
     Topics t
ON t.AccountID = a.AccountID
WHERE u.UserID=1
0 голосов
/ 19 февраля 2010
SELECT top.`topic_id` [etc]
FROM `accounts` acc
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE acc.`member_id` = 1

Базовый запрос, не уверен насчет CI.

, если вам нужна другая информация из идентификатора участника, то:

SELECT usr.`id`, acc.`account_id`, top.`topic_id` [etc]
FROM `users` usr
JOIN `accounts` acc ON (acc.`member_id` = usr.`id`)
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE usr.`id` = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...