sql - 仅当一个字段匹配多个值时才匹配(错误?)

标签 sql mysql

我有心理障碍。我很确定这是一个需要解决的非常简单的菜鸟问题,但我正在画一个空白:

我有一个文章标签系统。这是通过一个包含文章 ID 和标签 ID 的单独表来完成的,因此可以将多个标签分配给一篇文章,反之亦然。一切正常。但是现在我想做的是根据文章是否匹配两个或多个标签,或者匹配两个或多个标签但不匹配特定标签,或者匹配所有指定的标签等来过滤文章。

--------------------
|ID|ArticleID|TagID|
--------------------
|1 |4000     |123  |
|2 |4000     |3532 |
|3 |4000     |4386 |
|4 |4001     |3532 |
etc...
--------------------

所以它应该返回:

  1. 如果我只搜索 3532,则为 4000 和 4001
  2. 4000 如果我说我只想要匹配 123 和 4386 的东西
  3. 4000 和 4001 如果我希望它匹配 123 或 3532
  4. 4001,如果我希望它匹配 3532 而不是 123。

到目前为止,我的想法涉及到“select articleid where tagid = 123 and tagid = 4386”,但显然 tagid 字段不可能是同一记录上的两个东西(使用“或”会得到结果,但是它不能确保只有匹配 123 和 4386 的东西)。接下来,我打算一次查询一个条件,然后使用 PHP 过滤哪些文章应该/不应该匹配,但我脑海深处有一种挥之不去的感觉,认为这应该能够轻松完成在数据库级别,我只是想不出如何(或用谷歌搜索什么)。我希望能够一次过滤超过 1000 个标签。

最佳答案

您可以对 AND 情况使用多个内部联接:

select distinct a.ArticleID
from   Articles as a
    inner join Articles AS b on a.ArticleID = b.ArticleID and b.TagID = 123
    inner join Articles AS c on a.ArticleID = c.ArticleID and c.TagID = 4386;

对于 OR 的情况,你可以简单地做:

select distinct ArticleID
from   Articles
where TagID = 123 or TagID = 3532;

要一起处理所有情况,您可能最终会使用子查询:

select distinct a.ArticleID
from   Articles as a
where  exists (select * from Articles as b where a.ArticleID = b.ArticleID and b.TagID = 123);

然后您可以使用通用的 SQL 逻辑运算符(and、or、not)将多个 exists 条件连接在一起。对于大量标签,这很可能不是特别有效。

关于sql - 仅当一个字段匹配多个值时才匹配(错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569916/

相关文章:

sql - T-SQL 中的用户定义聚合函数而不是 .net 程序集?

php - ECHO 列出最受欢迎的主题标签

MySQL选择姓氏以特定字母开头的名字

mysql - 在 SQL 中查找 15 天的桶中的所有事件用户

mysql - 在sql中,如何根据另一列的值制作排名列?

sql - 使用 INTERSECT 或 HAVING 简化和/或优化 sql 查询

php - 为这些表选择查询

mysql - 在 MySQL 中高效计算大求和

mysql - 如果没有找到值,如何在 MySQL 中获取 SUM 函数以返回 '0'?

sql在连接内连接?