2011-06-16 76 views
2

我有一個MySQL查詢試圖獲取包含像'word%'之類的數據的所有頁面。我有一個名爲Pages2Data的多對多表。看起來,要做到這一點,我需要一個內部連接,將Pages連接到Pages2Data表,然後是另一個將Pages2Data連接到Data的內部連接。內部加入ON子句

以下方法無效,因爲嵌套的SELECT子句可以返回多行。我不知道如何解決,雖然它:

SELECT * FROM `Pages` 
    INNER JOIN `Pages2Data` ON 
     (`Pages2Data`.`DataID`=(SELECT `DataID` FROM `Data` WHERE `DataWord` LIKE 'word%')) 
     AND `Pages`.`PageID`=`Pages2Data`.`PageID`; 

回答

2
SELECT * FROM `Pages`  
INNER JOIN `Pages2Data` 
    ON `Pages`.`PageID`=`Pages2Data`.`PageID` 
INNER JOIN `Data` ON `Data`.`DataID`= `Pages2Data`.`DataID` 
WHERE `DataWord` LIKE 'word%'; 
+0

這樣做有沒有優勢,而不是沒有內部連接的JellyBelly方法? – carlbenson 2011-06-16 13:26:56

+0

隱式連接對於維護不利(等到需要將左側jon添加到另一個表並查看我的意思),並且更可能出現錯誤,例如意外交叉連接。幾乎20年前它們被更好的語法所取代,沒有任何情況(除了支持一箇舊的數據庫,它沒有語法),我想我會支持它們在新代碼中使用的位置。從何處分離這個連接也使得它在未來變得更加清晰。 – HLGEM 2011-06-16 13:31:30

+0

有趣......我很感謝解釋!最後一個問題:在你的查詢中,哪個子句首先被調用? Where子句或內部連接? – carlbenson 2011-06-16 13:39:46

0

試試這個

SELECT * FROM `Pages` p, `Pages2Data` p2d, `Data` d 
WHERE p.`PageID` = p2d.`PageID` 
AND p2d.`DataID` = d.`DataID` 
AND `DataWord` LIKE 'word%' 
+1

+1不會錯過明顯的像我一樣! – 2011-06-16 13:20:22

+0

儘管不知道'SELECT *'會返回在這個例子中想要的列 – 2011-06-16 13:21:05

+0

哇,我也覺得沒有發現這可能簡單得多。謝謝你看到它,JellyBelly。我想知道這是否是最佳順序?也許LIKE語句應該首先放在WHERE子句中,因爲無論如何它都需要運行,並且它會縮小ID匹配需要完成的工作量。思考? – carlbenson 2011-06-16 13:25:15

0

您可以查看「喜歡」 where子句。

SELECT * FROM 
      `Pages` 
INNER JOIN 
      `Pages2Data` ON (`Pages`.`PageID`=`Pages2Data`.`PageID`) 
WHERE 
      `DataWord` LIKE 'word%' 
+0

DataWord位於不在您的查詢中的稱爲數據的第三個表中。 – carlbenson 2011-06-16 13:27:46

0
SELECT * 
FROM Pages 
    INNER JOIN Pages2Data 
     ON Pages.PageID = Pages2Data.PageID 
    INNER JOIN Data 
     ON Pages2Data.DataID = Data.DataID 
WHERE DataWord LIKE 'word%' 
1

首先與您的查詢的問題:

  1. 聯接條件應該是旁邊的ON子句
  2. 沒有WHERE在最外層查詢
  3. 條款

固定查詢:

SELECT * FROM `Pages` 
INNER JOIN `Pages2Data` ON `Pages`.`PageID`=`Pages2Data`.`PageID` 
WHERE `Pages2Data`.`DataID`= (SELECT `DataID` FROM `Data` WHERE `DataWord` LIKE 'word%'); 

替代查詢:

SELECT `PG`.* 
FROM `Pages` `PG` 
INNER JOIN `Pages2Data` `PD` ON `PD`.`PageID` = `PG`.`PageID` 
INNER JOIN `Data` `DA` ON `PD`.`DataID` = `DA`.`DataID` 
WHERE `DA`.`DataWord` LIKE 'word%'; 
+0

你的第一個查詢應該有:WHERE Pages2Data.DataID IN(SELECT ...' – 2011-06-16 13:47:29

+0

是的,當然應該,我只是粘貼了原始查詢並修復了問題,謝謝! – Abhay 2011-06-16 13:52:16