2012-05-21 32 views
3

我有兩個查詢來獲取相同的數據,它們或多或少具有相同的執行時間。過濾之前加入或之後加入SQL

SELECT name AS prog_name,d.chap_name,d.vid_name,d.idvideo FROM program 
    JOIN (SELECT name AS chap_name,chapter.idprogram, c.vid_name,c.idvideo FROM chapter 
    JOIN (SELECT a.name AS vid_name, a.idvideo, b.idchapter FROM video a 
    JOIN (SELECT idvideo,idchapter,x.idchaptervideo FROM chaptervideo 
    JOIN (SELECT idchaptervideo FROM prescriptionvideo WHERE idprescription=50)x 
    ON x.idchaptervideo=chaptervideo.idchaptervideo) b 
    ON b.idvideo=a.idvideo)c 
    ON c.idchapter=chapter.idchapter) d 
    ON d.idprogram=program.idprogram 

SELECT program.name AS prog_name,chapter.name as chap_name,video.name as vid_name,video.idvideo FROM prescriptionvideo 
JOIN chaptervideo ON prescriptionvideo.idchaptervideo=chaptervideo.idchaptervideo 
JOIN video on chaptervideo.idvideo=video.idvideo 
JOIN chapter on chaptervideo.idchapter=chapter.idchapter 
JOIN program on chapter.idprogram=program.idprogram 
where idprescription=50 

有人可以指導我哪一個更好。我曾經在前者和之後加入後使用過濾。 MySQL的解釋顯示前者與後者相比有更多的行掃描。

+0

查看http://stackoverflow.com/questions/2577174/join-vs-subquery – eggyal

回答

0

第一個更好,因爲它易於讀取和寫入,並具有較低的行掃描值,否則查詢具有相同的結果集。

1

MySQL解釋顯示前者與後者相比有更多的行掃描相比 後者更多。

那麼,你有它!除了一個微小的細節。將過濾器條件放入連接語句中可以返回與將相同條件放在where子句中不同的結果。儘管它們返回相同的結果集,但您的兩個SQL查詢並不完全相同。

SELECT program.name AS prog_name,chapter.name as chap_name,video.name as vid_name,video.idvideo FROM prescriptionvideo 
JOIN chaptervideo ON prescriptionvideo.idchaptervideo=chaptervideo.idchaptervideo 
JOIN video on chaptervideo.idvideo=video.idvideo 
JOIN chapter on chaptervideo.idchapter=chapter.idchapter and chapter.idprescription=50 
JOIN program on chapter.idprogram=program.idprogram 
+0

從我如何閱讀這個問題看,'idprescription'屬於'prescriptionvideo',而不是'chapter'。我認爲這個問題中的兩個問題實際上歸結爲同一組過濾器/條件。但是,不能多說性能。 –

+0

@AndriyM - 啊......你說得對。有可能兩個查詢都是一樣的,但很難說。 –