簡體   English   中英

如何正確制定3表mysql查詢

[英]How to correctly formulate a 3 table mysql query

我需要執行以下任務的最佳方法。 如果可能的話,將其一直帶給我輸出變量,這樣我就可以更好地了解發生了什么,很多時候你們都認為自己比我聰明。

表1包含用戶信息,名字和姓氏,電子郵件等。表1中的主要auto_increment鍵是id。 表2包含一系列名字和姓氏,其鍵是xid,表1 id(用於僅顯示所有者列表)是uid。 表3保留了表2中用戶列表的配置數據。由於每個用戶每個列表可以具有多個配置,因此將其包含在表2中是不明智的。因此表3具有cxid(xid的表2鍵,標記列出其for),然后輸入uid,以標記哪個表1用戶可以訪問該配置。 它的auto_increment密鑰稱為cid。

所以要分解

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.

我需要做的是在表3上制定一個mysql查詢,以便對每一行提取cxid和uid,然后在表2中查詢特定列表。 找到列表后,需要從表2的該行中提取所有數據,以便可以對該數據執行功能。

我不確定要從哪里開始以最有效的方式編寫代碼,我不確定有某種簡單的方法可以做到這一點。 目前,上述值只是在URL中傳遞,但我將其更改為會話,但僅假設在查詢開始之前,該ive將每個變量定義為

$variable = $_GET['variable'];

因此變量是$ id,$ uid,$ cxid,$ xid

這應該做你想要的...

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

我敦促您使用一致的主鍵名稱和更好的外鍵名稱來提高可維護性和可預測性。

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)
)

從您描述的方式來看,表關系似乎是:

  • 一個用戶有很多列表
  • 一個列表有許多配置

如果我正確理解了問題,則需要遍歷每個配置條目,並檢索該配置的列表集。

如果我使用您的條款,則該架構如下所示:

  • 用戶身份)
  • 列表(xid,uid)
  • 配置(cid,cxid,uid)

其中id = uid,xid = cxid。

對於Config中的每個記錄,您要檢索的信息是其所有數據以及與該記錄相對應的所有List數據(您是否還需要User數據?)

這看起來很簡單,所以您可以使用一個SQL檢索所有數據:

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

此查詢將為您獲取Config表中的每條記錄,其中包含擁有該配置的List的所有數據,還包含擁有該列表的User的所有數據。

如果要檢索一個特定配置條目的數據,則可以將sql附加為這樣讀取(請注意,您只需要$ cid值,因為這是此關系中最深的主鍵):

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

因此,用PHP術語來說,您可能需要這樣處理:

// 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM