[英]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有一個或多個問題。
我應該如何加入此表? 謝謝。
為了解決兩個實體之間的多對多關系,我們添加了第三個表,一個關系表,其中外鍵引用了兩個實體表。
在關系表中添加的一行表示兩個實體之間的(等待它) 關系 。
例如,假設表question
和pot
都有一個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=7
和pot 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
是對question
或question_pot
的列的引用。 (如果此查詢在MySQL存儲程序(過程,函數,觸發器)中,則是對id
的引用,是對列的引用,還是對過程變量的引用。)
在某些情況下,當引用可以引用多個表中的列時,我們必須對列引用進行限定,以使引用變得明確,並導致MySQL拋出不明確的列引用錯誤。
可能有一個查詢工作正常,然后將一個列添加到表中,例如將id
列添加到question_pot
表中,然后查詢將因“歧義列”錯誤而開始失敗。
用我的想法,在表中添加列會導致“工作”查詢中斷,這是不可接受的。 我們可以通過明確限定列引用的方式來防止將來出現此類錯誤,即使現在不需要。
至於為什么我們選擇使用短別名(如q
和r
)代替表名。
用與在注釋中標識表名完全相同的方式:
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.