2011-11-03 84 views
2

我有三個表:國家,新聞和關係表country_news。一個國家有許多新聞,新聞可以來自許多國家。我想從一個國家做一個仰望提取所有相關的新聞,這是很容易:提取兩個多對多的查詢

SELECT news.* FROM country, news, country_news 
WHERE country.id = 1 
    AND country_news.country_id = country.id 
    AND country_news.news_id = news.id 

但現在我想提取與發現的新聞以及相關的國家。我還沒有嘗試過多次選擇,因爲我希望儘可能避免它。我嘗試了連接和group_concat,但我無法使它工作。這可能在一個查詢中嗎?

+0

爲什麼向下票呢?我不認爲答案是非常簡單的,因此這是一個很好的問題。 – GijsjanB

+1

Upvoted補償,我不認爲這是一個'downvote沒有給出一個原因'的問題。 – Johan

回答

3

嘗試這一個 -

SELECT n.*, c2.* FROM country c 
    JOIN country_news cn 
    ON cn.country_id = c.id 
    JOIN news n 
    ON cn.news_id = n.id 
    LEFT JOIN country_news cn2 
    ON cn2.news_id = n.id 
    LEFT JOIN country c2 
    ON cn2.country_id = c2.id 
WHERE c.id = 1 
+1

+1假設用戶希望所有關聯的國家都有關於國家1的新聞報道,這看起來是唯一可行的答案(儘管'LEFT JOIN country f2'應該是'LEFT JOIN country c2')。 –

+0

@Mark Ba​​nnister感謝您的留言。我編輯了答案。 – Devart

+0

非常感謝,這個作品像一個魅力!我不認爲我會很快找到這個查詢。 – GijsjanB

0
Select country.id from country c right Join 
country_news cn on c.id=cn.country_id 
where cn.news_id = @newsid 

應該給你所有國家IDS特定NewSID的

+0

這就像你說的那樣工作(如果你把country.id改爲c.id),但我想從一個國家進行查詢,導致所有相關國家的所有新聞。 – GijsjanB

0

你應該選擇國家特定的列也是如此。

SELECT country.name as country_name, news.* FROM country, news, country_news WHERE country.id = 1 AND country_news.country_id = country.id AND country_news.news_id = news.id; 
+0

這不起作用。新聞摘錄正確,但相關國家卻沒有。 – GijsjanB