MySQL - 按某些 "tags"选择,包括所有标签

标签 mysql

我已经成功地通过以 AND 方式匹配标签来获取文章过滤。

这是我当前的代码:

SELECT *
FROM articles a
JOIN article_tags a_t ON a_t.article_id = a.id
LEFT JOIN tags t ON t.id = a_t.tag_id
WHERE t.caption IN ('fire', 'water', 'earth')
HAVING COUNT(DISTINCT t.caption) = 3

地点:

  • 文章是我要获取的文章,包含 id、标题等...
  • tags 是标签列表,带有 id 和标题
  • article_tags关系表,包含article_id和tag_id

现在的问题是,匹配后,我想检索每篇文章具有的所有标签。即使它们由 3 个不同的标签匹配,一个可能有 5 个标签,其他 4 个标签,我希望它们包含在每一行中。在某些“标签”列中,诸如“标签,标签,标签”或我可以解析的任何内容。

有什么想法吗?我找不到解决办法...

最佳答案

您需要将查询作为子查询与返回所有标记的查询连接起来,并将它们与 GROUP_CONCAT() 组合起来。

select a.*, GROUP_CONCAT(DISTINCT t.caption) tags
from (select distinct a.*
      from articles a
      JOIN article_tags a_t on a_t.article_id = a.id
      JOIN tags t on t.id = a_t.tag_id
      WHERE t.caption IN ('fire', 'water', 'earth')
      GROUP BY a.id
      HAVING COUNT(DISTINCT t.caption) = 3) a
JOIN article_tags a_t on a_t.article_id = a.id
JOIN tags t on t.id = a_t.tag_id
GROUP BY a.id

顺便说一句,没有理由在查询中使用LEFT JOIN,因为您只关心标签中匹配的行。

我还想知道 COUNT() 中是否需要 DISTINCT ——你真的允许多个标签 ID 具有相同的标题吗?

关于MySQL - 按某些 "tags"选择,包括所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806869/

相关文章:

mysql - 将多个 MySQL 查询合并为一个

mysql - 从同一个表计算回合(平均值)并连接

mysql - 使用 Table.Column 是否可以提高性能?

mysql - 索引创建可以使用已有的索引吗?

mysql - Google Cloud SQL 声称我的数据库比 MySQL-Workbench 大得多

mysql - 我如何在 MySQL 中优化这个令人困惑的慢查询?

php mySQL 房间预订日历显示预订时的错误日期

php - 不支持的操作数类型错误/回车 - PHP

MySQL - 如何按元音范围选择数据

php - sql选择当前图像代码