2012-11-18 51 views
2

我有3個表中的所有不同的值,恢復他們:JOIN表,而不用重複,但需要列

:::NEWS::: 
ID | TITLE 
1 | New A 
2 | New B 

:::TAGTONEW::: 
NEWID | TAGID 
    1 | 1 
    1 | 2 
    2 | 2 
    2 | 3 

:::TAGS::: 
ID | TAG 
1 | religion 
2 | sport 
3 | politic 

並在此目標是搜索匹配的標籤給定列表消息(例如新聞與標籤體育和宗教)。好。問題是,當我這樣做:

SELECT * FROM news JOIN tagtonew ON news.id = newid JOIN tags ON tagid = tags.id 
WHERE tag IN ('religion','sport'); 

結果將是3排,其中2重複New A。好的,我可以使用GROUP BY news.id獲得一行,但問題是我需要返回所有與New A匹配的標籤(我需要返回New A與體育和宗教有關),我該怎麼做?需要newid?提前致謝。

編輯

上面的一個會導致:

New A - religion 
New A - sport 
New B - sport 

如果我組將是這樣的:

New A - religion 
New B - sport 

,但我需要知道,也關係到運動,因爲我需要以JSON的形式返回它。所以,我需要的輸出是這樣的:

New A - (religion, sport) 
New B - sport 
+0

你正在使用什麼rdbms? MySQL的? SQLSERVER?甲骨文?什麼? –

+0

SQLite + PHP ... –

+0

看到我的編輯如下:D –

回答

2

你只需要使用GROUP BYHAVING條款。

SELECT a.Title 
FROM news a 
     INNER JOIN tagtonew b 
      ON a.id = b.newid 
     INNER JOIN tags c 
      ON b.tagid = c.id 
WHERE c.tag IN ('religion','sport') 
GROUP BY a.Title 
HAVING COUNT(*) = 2 

UPDATE 1

使用GROUP_CONCAT

SELECT a.MovieName, '(' || GROUP_CONCAT(b.CategoryName) || ')' AS List 
FROM MovieList a 
     INNER JOIN CategoryList b 
      ON a.ID = b.MovieID 
WHERE b.CategoryName IN ('Comedy','Romance') 
GROUP BY a.MovieName 
+0

這不是我需要的。也許我不清楚。請參閱編輯。 –

+0

這個怎麼樣? [SQLFiddle演示使用SQLite(*點擊這裏*)](http://sqlfiddle.com/#!7/b60cb/1) –

+0

現在你得到它= D。非常感謝,我不知道這個命令=) –