2013-08-18 209 views
0

我在MySQL數據庫的一個表中運行一個查詢,其中包含多個「where id in」子句。我在每個查詢中加入了DISTINCT,試圖減少結果的數量。仍然鎖定我的MySQL表。任何我不知道的故障,或者我應該嘗試擺脫一些DISTICT?只有第一個DISTINCT是必要的。SQL multiple select ... where id in and DISTINCT

SELECT DISTINCT id, name 
    FROM TP_Test_Info 
    WHERE id IN (SELECT DISTINCT test_id 
       FROM TP_Test_Sections 
       WHERE id IN (SELECT DISTINCT section_id 
          FROM TP_Test_Questions 
          WHERE id IN (SELECT DISTINCT question_id 
              FROM TP_Student_Answers 
              WHERE student_id = 751))) 

最後一個表TP_Student_Answers有大約32,000個條目。其餘的要小得多。

我意識到我應該在大表中索引一些行。隔開它。任何其他問題突出?

+4

聽說加入的? – Strawberry

+0

你爲什麼不嘗試加入? – Shomz

+0

我聽說過JOINS。我不知道你可以像TI那樣嵌套它們。猜猜這是有幫助和粗魯之間的區別。 –

回答

1

您應該使用joins,並考慮創建索引至少在foreign keys

請嘗試以下

SELECT DISTINCT TP_Test_Info.id, TP_Test_Info.name 
FROM TP_Test_Info 
JOIN TP_Test_Sections 
    ON TP_Test_Sections.test_id = TP_Test_Info.id 
JOIN TP_Test_Questions 
    ON TP_Test_Questions.section_id = TP_Test_Sections.id 
JOIN TP_Student_Answers 
    ON TP_Student_Answers.question_id = TP_Test_Questions.id 
WHERE TP_Student_Answers.student_id = 751 
+0

使用連接的優點是什麼?我會用這個,只是想知道爲什麼這是有利的。 –

+0

數據庫引擎將更容易地優化查詢,利用索引等。加上'IN'並不是性能最好的運營商,即使它「有意義」,另一種方法是使用'EXISTS'。在你的查詢中,當你想到它時,你要求數據庫做很多工作來有效地檢查存在,這對於數據庫來說更自然地用一個連接實現(認爲'關係'不僅僅是'邏輯' )。可能最好的做法是查看並比較兩個查詢的執行計劃,以查看數據庫如何處理它們。 –

+0

謝謝!我仍然試圖讓我的頭繞JOINS。我是一名導師,而不是程序員,所以這些東西並不在我的知識領域。只要爲我自己的網站做。 –

相關問題