Nasıl verimli sql sorgusu alt kayıtlar birden fazla tablodan?

2 Cevap php

Biz basit bir veritabanı var. Kullanıcı tablo kullanıcıları tutar. Hesapları tablo her kullanıcı için birden fazla hesap tutar. Başlıklar tablo, her hesap için birden fazla konu tutar.

Yani, bir kullanıcı birden fazla hesap olurdu ve her hesap birden çok konu olurdu. Yani, id = 1 olan bir kullanıcı varsa, nasıl verimli bir şekilde kullanıcının tüm hesaplarını ve konuları almak için tüm 3 tabloları sorgulamak mı?

Şu anda birçok sql sorguları çalıştırmak foreach döngüleri kullanıyorum. Sadece ne istediğinizi almak için bir sql sorgusu çalıştırmak için bir yolu var mı?

İşte ben şu anda (CodeIgniter kodu olan) kullanıyorum kodu:

$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 Cevap

Sadece bir çok başka biri ile çok bir.

Kullanıcı-> Birçok Hesaplar

Hesap> Birçok Konu

Think of your table of Users that one row is unique (contains one user say Jon Doe). Think of your accounts table referencing some sort of user (that is multiple accounts can contain the same user, in addition, account Acme 1 and Acme 2 both pertain to user Jon Doe). Finally, think of your topics table containing a reference to an account. That is each topic has an account id. So that means accounts have many topics associated with them.

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

: Eğer bir kullanıcı daraltmak istiyorsanız, sadece WHERE tümcesi eklemek

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
SELECT top.`topic_id` [etc]
FROM `accounts` acc
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE acc.`member_id` = 1

CI hakkında emin temel sorgu değildir.

Eğer üye id diğer bilgi gerekiyorsa:

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