mysql - 选择新闻,加入多个标签

标签 mysql sql

考虑这三个表:

新闻(列:ID等)

News_Tag_Cross(列:ID、NewsID、TagID)

标签(列:ID、名称)

如何获取具有两个标签的所有新闻文章:“经销商”和“客户”?

我可以对两个标签运行此查询并对结果进行 UNION,但会返回 Dealer 标签或 Client 标签的行。显然,我想返回连接到两者的新闻项目。

SELECT n.id FROM news
INNER JOIN news_tag_cross ntc 
  ON ntc.newsid=n.id
INNER JOIN tags t 
  ON t.id=ntc.tagid
WHERE news_tag_cross.tagID = 'DealerID'

我必须注意,这是我当前查询的粗略翻译 - 我真的不想泄露表名等,或者用额外的列和数据让任何人感到困惑。

最佳答案

您可以将聚合与 having 子句一起使用:

SELECT n.id
FROM news INNER JOIN
     news_tag_cross ntc 
     ON ntc.newsid = n.id INNER JOIN
     tags t 
     ON t.id = ntc.tagid
GROUP BY n.id
HAVING SUM(t.name = 'Dealer') > 0 AND
       SUM(t.name = 'Client') > 0;

还有其他方法可以表达这一点(特别是使用连接)。我喜欢这种方法,因为 having 子句对于包含或排除的条件非常灵活。

关于mysql - 选择新闻,加入多个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108918/

相关文章:

php - 如何输出带有星星的平均评分?

java - 从mysql获取大数据时出现连接异常

sql - Postgresql 中的不同类型.. 如何正确执行此操作?

sql - 如何在 SQLite 中逻辑删除记录

php - Laravel 从查询构建器获取特定列

php - Laravel - php artisan 迁移问题 - 找不到驱动程序 - ubuntu

mysql - SQL笛卡尔积/交叉连接方向

mysql - 在 2 列上连接 mysql 表两次 = 1 列

MySQL:使用别名作为列

c# - 最大函数 Linq 查询 - Nullable Int 不是 IEnumerable?