簡體   English   中英

SQL多對多關系

[英]SQL many to many relation

我正在使用Wordpress測驗插件。 它有兩個表(實際上更多,但我想重點討論這個問題)–'questions'和'questionpots':

'問題':QuestionID ----問題---- potID

'questionpots':potID ---- potName

默認查詢是:$ SQL ='Select * FROM Problems WHERE potID ='。$ potID;

因此,默認情況下,每個問題都分配給一個特定的底池(“問題”表中的“ potID”),並且關系是“一對多”。 我想做的是向不僅僅是一個鍋子分配問題,例如,詢問“羅馬何時淪陷?”的問題是有人選擇“羅馬歷史”鍋子還是“古代歷史”鍋子。

因此,我添加了第三個表“ relations”,它與questionID和potID匹配。 問題是,我無法從$ questID的“問題” WHERE potID ='。$ potID中選擇*,假設$ potID有一個或多個問題。

我應該如何加入此表? 謝謝。

為了解決兩個實體之間的多對多關系,我們添加了第三個表,一個關系表,其中外鍵引用了兩個實體表。

在關系表中添加的一行表示兩個實體之間的(等待它) 關系

例如,假設表questionpot都有一個id列作為主鍵:

CREATE TABLE question_pot
( question_id     INT UNSIGNED NOT NULL COMMENT 'fk ref question' 
, pot_id          INT UNSIGNED NOT NULL COMMENT 'fk ref pot'
, PRIMARY KEY (question_id, pot_id)
, CONSTRAINT FK_question_pot_question 
     FOREIGN KEY (question_id) REFERENCES question(id)
, CONSTRAINT FK_question_pot_pot
     FOREIGN KEY (pot_id) REFERENCES pot(id)
) ENGINE=InnoDB

要將question id=444的關系添加到兩個罐pot id=7pot id=13

INSERT INTO question_pot VALUES (444,7), (444,13); 

並在question表中pot_id列。 您可以先保存...

INSERT INTO question_pot (question_id, pot_id) 
SELECT q.id
     , q.pot_id
  FROM question q
 WHERE q.pot_id IS NOT NULL
;

然后從question刪除pot_id列。


如果到此為止,現在只需要執行JOIN操作...

要獲得pot id=13所有問題,例如:

SELECT q.*
  FROM question q
  JOIN question_pot r
    ON r.question_id = q.id
 WHERE r.pot_id = 13

跟進

上面的查詢給出了為表分配別名 ,並使用別名限定列引用的示例。

限定列引用是最佳實踐; 它使某人更容易閱讀和解釋該語句,而無需他們查找表的定義以找出哪個列來自哪個表。

比較上面的查詢與此:

SELECT *
  FROM question
  JOIN question_pot
    ON question_id = id
 WHERE pot_id = 13

現在,嘗試回答以下問題: id是對questionquestion_pot的列的引用。 (如果此查詢在MySQL存儲程序(過程,函數,觸發器)中,則是對id的引用,是對列的引用,還是對過程變量的引用。)

在某些情況下,當引用可以引用多個表中的列時,我們必須對列引用進行限定,以使引用變得明確,並導致MySQL拋出不明確的列引用錯誤。

可能有一個查詢工作正常,然后將一個列添加到表中,例如將id列添加到question_pot表中,然后查詢將因“歧義列”錯誤而開始失敗。

用我的想法,在表中添加列會導致“工作”查詢中斷,這是不可接受的。 我們可以通過明確限定列引用的方式來防止將來出現此類錯誤,即使現在不需要。

至於為什么我們選擇使用短別名(如qr )代替表名。

用與在注釋中標識表名完全相同的方式:

wp_ai_quiz_tblquestions    (=question)
wp_ai_quiz_tblquestionpots (=pot)
wp_ai_quiz_question_pot    (=question_pot) 

我基本上是在用表別名說同樣的話:

wp_ai_quiz_tblquestions     (=q)
wp_ai_quiz_tblquestionpots  (=p)
wp_ai_quiz_question_pot     (=r)

比較閱讀以下內容:

SELECT q.*
  FROM wp_ai_quiz_tblquestions q
  JOIN wp_ai_quiz_question_pot r
    ON r.question_id = q.id
 WHERE r.pot_id = 13

閱讀此內容:

SELECT wp_ai_quiz_tblquestions.*
  FROM wp_ai_quiz_tblquestions
  JOIN wp_ai_quiz_question_pot
    ON wp_ai_quiz_question_pot.question_id = wp_ai_quiz_tblquestions.id
 WHERE wp_ai_quiz_question_pot.pot_id = 13

再扔幾張表,也不會像我一直在排隊那樣排隊,這需要讀者付出更多的努力才能理解該語句在做什么。 在真正復雜的查詢中,引用了六個或更多表,我將在查詢上方添加注釋,以解釋別名的用法。

-- find all questions in a particular pot
-- q = question row to be returned from wp_ai_tblquestion 
-- r = relationship between question and pot to be searched
SELECT q.id
     , q.name
     , ...

暫無
暫無

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

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