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

我正在寻找一个查询来查找与给定标签集匹配的对象。 假设我有以下数据(在[object] - > [tags] * format中)

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';

运行时不会产生任何结果。

===============>>#1 票数:4 已采纳

鉴于:

  • 对象表(主键id)
  • objecttags表(外键objectId,tagid)
  • 标签表(主键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'; 

这似乎是倒退,因为你想要和,但问题是,2个标签不在同一行,因此,一个并没有产生任何东西,因为1个单行不能同时是水果和食物。 此查询通常会产生重复,因为每个标记每个对象将获得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;

===============>>#2 票数:4

哦天哪,我可能误解了你原来的评论。

在SQL中执行此操作的最简单方法是使用三个表:

1) Tags ( tag_id, name )
2) Objects (whatever that is)
3) Object_Tag( tag_id, object_id )

然后,您可以快速,轻松,高效地询问您想要的数据问题(如果您正确索引)。 如果你想获得想象力,你也可以允许多字标签(有一种优雅的方式,而且我可以想到一种不那么优雅的方式)。

我认为这就是你所拥有的,所以下面的SQL将起作用:

文字方式:

    SELECT obj 
      FROM object
     WHERE EXISTS( SELECT * 
                     FROM tags 
                    WHERE tag = 'fruit' 
                      AND oid = object_id ) 
       AND EXISTS( SELECT * 
                     FROM tags 
                    WHERE tag = 'Apple'
                      AND oid = object_id )

还有其他方法可以做到这一点,例如:

SELECT oid
  FROM tags
 WHERE tag = 'Apple'
INTERSECT
SELECT oid
  FROM tags
 WHERE tag = 'Fruit'

===============>>#3 票数:0

@Kyle:您的查询应该更像:

SELECT object WHERE tag IN ('fruit', 'food');

您的查询正在寻找标签既是水果又是食物的行,这是不可能看到的,因为该字段只能有一个值,而不能同时具有两个值。

===============>>#4 票数:0

将史蒂夫M.的建议与杰里米相结合,你将得到一个你正在寻找的记录:

select object
from tblTags
where tag = @firstMatch
and (
       @secondMatch is null 
       or 
       (object in (select object from tblTags where tag = @secondMatch)
     )

现在,这不能很好地扩展,但它会得到你想要的。 我认为有一个更好的方法可以做到这一点,这样你可以很容易地拥有N个匹配的项目,而不会对代码产生很大的影响,但它现在逃脱了我。

===============>>#5 票数:0

我推荐以下架构。

Objects: objectID, objectName
Tags: tagID, tagName
ObjectTag: objectID,tagID

使用以下查询。

select distinct
    objectName
from
    ObjectTab ot
    join object o
        on o.objectID = ot.objectID
    join tabs t
        on t.tagID = ot.tagID
where
    tagName in ('red','fruit')

===============>>#6 票数:-2

我建议你的表每个记录有1个标记,如下所示:

 apple -> fruit
 apple -> red
 apple -> food
 banana -> fruit
 banana -> yellow
 banana -> food

那你就可以了

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

如果你真的想按照自己的方式去做,你可以这样做:

 SELECT object WHERE tag LIKE 'red' OR tag LIKE '% red' OR tag LIKE 'red %' OR tag LIKE '% red %';

  ask by Kyle Cronin translate from so

未解决问题?本站智能推荐:

2回复

匹配Django中的manytomany字段

我要做的只是通过标签将图像与部门模型匹配。 如何为部门页面编写视图以执行此操作? 我到处都看了,但是找不到答案。 请帮忙! 楷模:
2回复

具有多个值的单列匹配多个值sql

我在表格newsarchive中有一个tags列,在其中可以输入多个用逗号分隔的值。 我有一个页面,其中将显示与newsarchive.tags指定的标签匹配的新闻。 页面中的标签也可以具有多个值。 现在,我想获取与具有newsarchive.tags页面中的标签匹配的记录。 是否有
1回复

SQL Server查询:标记查询

我陷入了SQL查询(对于SQL Server)。 我是SQL的新手,并且没有太大的进步。 我创建了一个测试项目来测试标记。 我有3张桌子,如下所示: 我正在尝试选择所有标签值为“绿色皮肤”的怪物。
2回复

支持标签系统的sql方案是什么?

我已经在php中编写了一个小型论坛软件,人们在其中发布帖子,并且我想支持标签。 我应该为此创建几个SQL表? 并简要介绍标签系统如何工作? 谢谢
2回复

如何仅通过使用SQL获得标签关系结果?

以及如何编写SQL查询以使数据如下所示: 注意:如果标记引用的是同一文章,则Relationships_degree + 1 这种方法的目的是计算标签之间的关系,有人可以帮上忙吗?
1回复

有关多个相关标签和项目关系的SQL查询

我已经在SO中搜索了以下一些查询,但是找不到与我的搜索相匹配的内容,在IN , INNER JOIN和LEFT JOIN之间写它们有点迷失了。 当前数据库关系 1.按标签获取项目 TAG.url是从$_GET获得的字符串,而不是从INT ID获得的字符串。 例如,使用网址
2回复

SQL - 查找所有相关标签?

我有一个如下所示的关系标签表。 对于所有三个node_id (1,2,3),存在关系tag_id “1”。 使用tag_id“1”作为起点,如何获得按发生次数排序的所有标签的列表? 例如,tag_id“3”存在于所有三个node_id记录中 - 而tag_id 4仅存在两次(node
1回复

SQL查询:如何过滤带有标签表的父标签和子标签?

从此帖子获得正确答案后,我还有另一个问题-我必须进一步过滤行,这是我必须确保必须将标签标记到页面上。 这是我的root_mm_tagged_pages table 所以我想返回这个结果, 我尝试使用此查询,但收到错误- #1064 - You have an error i
2回复

需要sql查询帮助来查找具有最多指定标签的内容

假设我有以下表格: TAGS id:整数 name:string 帖子 id:整数 文章主体 引用的Tagging id:整数 tag_id:整数 post_id:整数 我将如何编写一个查询,按照包含最多数量的以下标记的帖子的顺序选择所有
2回复

需要有关SQL查询的帮助以查找带有所有指定标签的事物

假设我有以下表格: 标签 id:整数 名称:字符串 帖子 id:整数 正文 标记 id:整数 tag_id:整数 post_id:整数 我将如何编写一个查询来选择所有带有以下所有标记(标记表的名称属性)的标记的查询:“奶酪”,“葡萄酒”,