【问题标题】:JOIN tables without repeat but need all the different values of a columnJOIN 不重复但需要列的所有不同值的表
【发布时间】:2012-11-18 23:42:37
【问题描述】:

我有 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

【问题讨论】:

  • 您使用的是什么 rdbms? mysql? sqlserver?甲骨文?什么?

标签: php sql sqlite


【解决方案1】:

您只需要使用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

更新 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多