gpt4 book ai didi

SQL多对多匹配

转载 作者:行者123 更新时间:2023-12-04 13:53:00 24 4
gpt4 key购买 nike

我正在为网站实现标记系统。每个对象有多个标签,每个标签有多个对象。这是通过维护一个表来实现的,每个记录都有两个值,一个用于对象的 ID 和标签。

我想编写一个查询来查找与给定标签集匹配的对象。假设我有以下数据([object] -> [tags]* 格式)

apple -> fruit red food
banana -> fruit yellow food
cheese -> yellow food
firetruck -> vehicle red

如果我想匹配(红色),我应该得到苹果和救火车。如果我想匹配(水果,食物),我应该得到(苹果,香蕉)。

我如何编写 SQL 查询来做我想做的事?

@Jeremy Ruten,

感谢您的回答。使用的符号用于提供一些示例数据 - 我的数据库确实有一个表,每个记录有 1 个对象 ID 和 1 个标签。

其次,我的问题是我需要获取匹配所有标签的所有对象。用你的 OR 代替 AND 像这样:

SELECT object WHERE tag = 'fruit' AND tag = 'food';

运行时不产生任何结果。

最佳答案

给定:

  • 对象表(主键id)
  • objecttags 表(外键 objectId、tagid)
  • tags表(主键id)

    SELECT distinct o.*
    from object o join objecttags ot on o.Id = ot.objectid
    join tags t on ot.tagid = t.id
    where t.Name = 'fruit' or t.name = 'food';

这似乎倒退了,因为你想要 and,但问题是,2 个标签不在同一行,因此,and 不会产生任何结果,因为单行不能既是水果又是食物。此查询通常会产生重复项,因为您将获得每个对象的 1 行,每个标记。

如果你真的想做一个,在这种情况下,你需要一个 group by , 和一个 having count = <number of ors>例如在您的查询中。

  SELECT distinct o.name, count(*) as count
from object o join objecttags ot on o.Id = ot.objectid
join tags t on ot.tagid = t.id
where t.Name = 'fruit' or t.name = 'food'
group by o.name
having count = 2;

关于SQL多对多匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24715/

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