MySQL内连接失败

时间:2014-01-06 16:58:51

标签: mysql sql join inner-join

我有这个简单的连接语句,我很确定语法是正确的。我看了一些教程,我发现我的代码和例子之间没有任何区别。 这是声明:

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

我收到以下错误:

  

'on clause'

中的未知列's.news_id'

我真的不知道为什么会启动此错误,因为列'news_id'存在于它必须存在的每个表中。 如果我改变ON子句中的顺序(即我从p.news_id = n.news_id开始),我得到相同的错误(unknwonw列p.news_id)。所以我觉得别名有问题,但我真的没有线索。 谢谢你的帮助;)

4 个答案:

答案 0 :(得分:0)

试试这个,你在JOINing表中犯了错误。 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

答案 1 :(得分: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

通常不会在or条件之间使用join

由于MySQL使用的优先规则,出现错误。正如documentation所解释的那样:

  

INNER JOIN和(逗号)在没有的情况下在语义上是等价的   连接条件:两者之间产生笛卡尔积   指定的表(即第一个表中的每一行都是   加入第二个表格中的每一行。)

     

但是,逗号运算符的优先级小于INNER   JOIN,CROSS JOIN,LEFT JOIN等等。如果你混合使用逗号连接   当有连接条件时,其他连接类型,错误   form可能会出现'on子句'中的未知列'col_name'。信息   关于这个问题的处理将在本节后面给出。

所有这一切,我不确定这是否是您想要的查询。您将从不同的表中获得不同值的笛卡尔积。您可能应该使用示例数据和所需结果提出另一个问题,以便有人可以帮助您进行正确的查询。

答案 2 :(得分: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

但是,我很确定你想要使用union或其他东西

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

答案 3 :(得分: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