我有这个简单的连接语句,我很确定语法是正确的。我看了一些教程,我发现我的代码和例子之间没有任何区别。 这是声明:
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)。所以我觉得别名有问题,但我真的没有线索。 谢谢你的帮助;)
答案 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