2014-01-06 52 views
0

我得到了这个简单的连接语句,我非常肯定语法是正确的。我看了一些教程,我没有发现我的代码和示例有任何区别。 这里的语句:MySQL内部连接失败

SELECT n.id nId, n.news_date, n.news_type, 
     p.id pId, p.title pTitle, p.file_path pPath, 
     s.id sId, s.title sTitle, s.content sContent, 
     v.id vId, v.title vTitle, v.url vUrl 
FROM photo_news p, standard_news s, video_news v 
INNER JOIN news n 
ON p.news_id = n.id OR s.news_id = n.id OR v.news_id = n.id 
ORDER BY n.news_date DESC 

我收到以下错误:

Unknown column 's.news_id' in 'on clause'

我真的不知道是因为列“news_id”在它存在的每个表都存在,为什么推出这个错误。 如果我改变ON子句的顺序(即我从p.news_id = n.news_id开始),我得到相同的错误(unknwonw列p.news_id)。所以我认为别名有问题,但我真的没有线索。 感谢您的帮助;)

+1

不要将传统连接语法与显式连接语法混合使用。 –

+0

你可以在ON语句中使用OR吗? – user1336827

+0

@juergend我同意你的意见(事实上,避免逗号加入) - 但它是'传统'? – Strawberry

回答

0

也许您正在寻找这样的事情将照片新闻中的记录数据返回至其他表中的至少一个中。

在这种情况下,您需要在JOIN条件下使用LEFT JOIN而不是OR。

  SELECT n.id nId, n.news_date, n.news_type, 
       p.id pId, p.title pTitle, p.file_path pPath, 
       s.id sId, s.title sTitle, s.content sContent, 
       v.id vId, v.title vTitle, v.url vUrl 
      FROM news n 
LEFT OUTER JOIN photo_news p 
      ON n.id = p.news_id 
LEFT OUTER JOIN standard_news s 
      ON n.id = s.news_id 
LEFT OUTER JOIN video_news v 
      ON n.id = v.news_id 
WHERE p.news_id IS NOT NULL 
    OR s.news_id IS NOT NULL 
    OR v.news_id IS NOT NULL 

    ORDER BY n.news_date DESC 
+0

所有的答案看起来不错,谢谢你们。但是我不擅长SQL,所以我不知道应该选择哪一个。让我解释一下:_news_可以被视为“超级表”和_photo_news_,_standard_news_,_video_news_“继承表”。实际上在应用程序中,这些是我的实体。我想检索所有的新闻,不管他们的类型,我应该选择哪一种说法? – Tinathnath

+0

最后我尝试了所有的解决方案,这正是我想要的,谢谢;) – Tinathnath

+0

再次成功为我的头脑阅读技巧:) – mucio

0

试试这个,你在加入表格时犯了错误。 for reference you can see how multiple tables are JOINed together.

SELECT n.id nId, n.news_date, n.news_type, 
     p.id pId, p.title pTitle, p.file_path pPath, 
     s.id sId, s.title sTitle, s.content sContent, 
     v.id vId, v.title vTitle, v.url vUrl 
FROM photo_news p INNER JOIN standard_news s  
p.news_id = s.news_id 
INNER JOIN video_news v 
on s.news_id = v.news_id 
INNER JOIN news n 
on v.news_id = n.id 
ORDER BY n.news_date DESC 
0

您仅混合风格和新风格的联接。只需使用明确的join语法。你from大概应该是:

FROM news n join 
    photo_news p 
    on p.news_id = n.id join 
    standard_news s 
    on s.news_id = n.id join 
    video_news v 
    on v.news_id = n.id 

使用条件orjoin之间通常不使用。

由于MySQL使用的优先规则而出现错误。作为documentation解释说:

INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).

However, the precedence of the comma operator is less than of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.

所有这一切说,我不知道这是真的,你想查询。您将从不同的表中获得不同值的笛卡尔积。您可能应该提供另一个问题样本数据和期望的结果,所以有人可以帮助您正确的查询。

0

您正在使用与支持的语法混合的不建议使用的连接语法。 请你帮个忙,写那些加入适当

http://dev.mysql.com/doc/refman/5.0/en/join.html

SELECT n.id nId, n.news_date, n.news_type, 
     p.id pId, p.title pTitle, p.file_path pPath, 
     s.id sId, s.title sTitle, s.content sContent, 
     v.id vId, v.title vTitle, v.url vUrl 
FROM photo_news p 
left/inner/right/"" join standard_news s on CONDITION 
left/inner/right/"" join video_news v on CONDITION 
INNER JOIN news n 
ON p.news_id = n.id OR s.news_id = n.id OR v.news_id = n.id 
ORDER BY n.news_date DESC 

但是,我敢肯定你想使用工会或东西

SELECT ... 

FROM 
select * from (photo_news p 
union all standard_news s 
union all video_news v) all_news 
INNER JOIN news n on CONDITION