gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:46:14 24 4
gpt4 key购买 nike

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

我有一个文章标签系统。这是通过一个包含文章 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com