Doğru bir şekilde 3 tablo mysql sorgusu nasıl formüle

2 Cevap php

Ben şu görevi yerine en iyi yol gerekir. Mümkünse, ne oluyor bu yüzden daha iyi görebiliyorum bana çıkış için değişkenleri veren tüm yol aşağı çekmek, bir çok kez siz akıllı öyleyim daha im varsayalım.

Table 1, holds user information, first and last name, email etc. The primary auto_increment key in table 1 is id. Table 2, holds a series of first and last names, its key is xid, and the table 1 id (used to display only the owners list) is uid. Table 3, holds config data for the user's list in table 2. Since you can have multiple configs per list per user, it wasnt prudent to include it in table 2. So table 3 has cxid (the table 2 key of xid, marking which list its for), and then uid, marking which table 1 user can access that config. Its auto_increment key is called cid.

Yani onu yıkmak için

Table 1(user) - Primary key = id
Table 2(list) - Primary key = xid, and user field is uid.
Table 3(config) - Primary key = cid, list field is cxid, and user field is uid.

Her satır için, bu cxid ayıklar ve uid, daha sonra belirli bir liste için tablo 2 sorgular böylece yapmam gereken şey, masada 3 bir mysql sorgu formüle olduğunu. Bu liste bulur sonra, bu verilerle bir fonksiyonu gerçekleştirebilir, böylece, Tablo 2 de bu satır tüm verileri elde etmek için gereklidir.

Bu en verimli şekilde yazmaya başlamak için tam olarak emin değil Im, bunu yapmanın kolay bir şekilde bir tür olduğundan emin im. Şu an için, yukarıdaki değerler sadece URL geçirilen ediliyor, ama oturumlara değiştirmek için gidiyorum, ama sadece bir sorgudan önce varsaysak bile ive her değişken tanımlanan başlar

$variable = $_GET['variable'];

Yani değişkenler $ id, $ uid olan, $ cxid, $ xid

2 Cevap

Bu ne istediğinizi yapmalıyım ...

SELECT *
FROM user AS [u]
JOIN list AS [l]
    ON l.uid = u.id
JOIN config AS [c]
    ON c.uid = u.id
    AND c.cxid = l.xid
WHERE u.id = $id
AND l.xid = $xid
AND c.cxid = $cxid

Ben sürdürülebilirliği ve öngörülebilirliği artırmak için tutarlı birincil anahtar adları ve iyi yabancı anahtar adları kullanmaya çağırıyorum.

CREATE TABLE user
(
id INT NOT NULL
,CONSTRAINT pk_userId PRIMARY KEY (id)
)


CREATE TABLE list
(
id INT NOT NULL
,userId INT NOT NULL
,CONSTRAINT pk_listId PRIMARY KEY (id)
,CONSTRAINT fk_userList FOREIGN KEY (userId) REFERENCES user(id)
)


CREATE TABLE config
(
id INT NOT NULL
,userId INT NOT NULL
,listId INT NOT NULL
,CONSTRAINT pk_configId PRIMARY KEY (id)
,CONSTRAINT fk_userConfig FOREIGN KEY (userId) REFERENCES user(id)
,CONSTRAINT fk_listConfig FOREIGN KEY (listId) REFERENCES list(id)
)

Tablo ilişkileri gibi bunu anlattığım yoldan, öyle görünüyor:

  • Bir kullanıcı birçok listeleri vardır
  • Bir liste birçok yapılandırmaları vardır

Ben doğru sorunu anlamak, her yapılandırma giriş geçmesi ve bu yapılandırma için listelerin kümesi almak istiyorum.

Ben senin terimleri kullanmak durumunda, şema gibi bir şey görünüyor:

  • Kullanıcı (id)
  • Liste (xid, uid)
  • Yapılandırma (cid, cxid, uid)

id = uid ve xid = cxid.

Ve almak istediğiniz bilgi, tüm verilerin yanı sıra, bu kayda karşılık listesi tüm verileri (siz de kullanıcı verilerini gerekiyor?), Config'de her kayıt için, bir

Bu yalındır ilişki gibi görünüyor, bu yüzden tek bir SQL ile tüm bu verileri alabilir:

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid

Bu sorgu da bu listeyi sahibi Kullanıcı için tüm verileri içeren, bu yapılandırma sahibi listesi için tüm verileri içeren, yapılandırma tabloda size her kayıt alacak.

Eğer belirli bir yapılandırma giriş için veri almak istedim, (bu ilişki derin birincil anahtar olduğu gibi, sadece $ cid değer gerekir unutmayın) gibi okumak için sql ekleme olabilir:

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid
where c.cid = $cid

Yani, PHP açısından, o şekilde yaklaşmak isteyebilirsiniz:

// here is the sql query
$query = "select c.*, l.*, u.* from Config c join List l on c.cxid = l.xid join User u on u.id = l.uid";

// here are the results from MySQL
$result = mysql_query($query);

// and now for each result, throw it into an array called $row
while($row = mysql_fetch_assoc($result))
{
  // get some data from that row, for example, Config.`data`, List.`functionname`, and User.`FirstName`
  $config_data = $row['data'];
  $function_name = $row['functionname'];
  $first_name = $row['FirstName'];

  // now do whatever you'd like with this data, before looping to the next record...
  some_function($config_data, $function_name, $first_name);
}