2014-01-06 183 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