2

我有 3 张桌子,正在恢复它们:

    :::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 与体育和宗教有关),我该怎么做?请求新人?提前致谢。

编辑

上面的结果将是:

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

如果我组会是这样的:

New A - religion
New B - sport

但我需要知道 A 也与运动有关,因为我需要以 JSON 格式返回它。所以我需要输出是这样的:

New A - (religion, sport)
New B - sport
4

1 回答 1

2

你只需要使用GROUP BYandHAVING子句。

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

更新 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
于 2012-11-18T23:45:36.470 回答