2011-06-16 73 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