2010-02-19 90 views
3

我們有一個簡單的數據庫。用戶表保存用戶。帳戶表爲每個用戶保存多個帳戶。 「主題」表包含每個帳戶的多個主題。如何高效地從多個表中查詢子記錄?

因此,用戶可能有多個帳戶,每個帳戶都有多個主題。因此,如果我有一個id = 1的用戶,我如何有效地查詢所有3個表以獲取該用戶的所有帳戶和主題?

我目前正在使用運行許多sql查詢的foreach循環。有沒有辦法只運行一個SQL查詢來得到我想要的?

這裏是我目前使用的代碼(這是笨代碼):

$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; 
+0

你正在尋找一個SQL加入?或更優雅的PHP語法使用codeignitor? – 2010-02-19 15:35:01

+0

在SQL方面應該做的更多,它的數據問題不是UI問題。 – JonH 2010-02-19 15:40:20

+0

如果其中一個帳戶尚未有任何主題,該怎麼辦?你還是不想取回那個賬戶?條款同樣適用。如果一個主題沒有任何條款?你想要檢索該主題嗎?也許這些情況是不可能的,但如果它們是,它們是重要的細節。 – goat 2010-02-19 16:14:12

回答

3

只是一個一對多另一個一對多。

用戶 - >多個賬戶

帳戶 - >許多主題

認爲用戶的表的一個行是唯一的(包含一個用戶說喬恩DOE)。 想象你的賬戶表引用某種用戶(即多個賬戶可以包含同一用戶,此外,帳戶Acme 1和Acme 2都與用戶Jon Doe有關)。 最後,想一想您的主題表格,其中包含對帳戶的引用。這是每個主題都有一個帳戶ID。這意味着帳戶有很多與他們相關的主題。

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

它工作的很好,雖然它似乎希望「a.Account」和「t.Topic」成爲Accounts and Topics表中的特定字段。我可以使用''選擇u.id作爲user_id,a.id作爲account_id,t.id作爲topic_id ...「,但是有沒有辦法選擇整個記錄,而不必指定每個字段? – bperdue 2010-02-19 16:23:37

+0

如果你想每個記錄你可以通配卡選擇你*,噸。* ...等 雖然我建議不要使用通配符...你應該總是列出每個字段 – JonH 2010-02-19 16:28:11

+0

沒關係,我知道了從下面的dkantowitz:「SELECT u。*,a。*,t。* ...」 – bperdue 2010-02-19 16:30:53

0
SELECT top.`topic_id` [etc] 
FROM `accounts` acc 
JOIN `topics` top ON (top.`account_id` = acc.`id`) 
WHERE acc.`member_id` = 1 

是基本的查詢,不知道CI。

如果你需要從成員ID,然後在其它信息:

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