代码之家  ›  专栏  ›  技术社区  ›  Nicholaus Chipping

MySQL多对多设置-如何将布尔表达式转换为MySQL?

  •  1
  • Nicholaus Chipping  · 技术社区  · 8 年前

    这似乎是一个奇怪的问题,但现在。。。

    我有一个类似的表结构:

    Object
    id, name
    

    Tag
    id, name
    

    ObjectTag
    object_id, tag_id
    

    我想做的是获取一个布尔表达式,如

    ((1 OR 2) AND (3)) AND (!4 AND !5)
    

    并将其转换为有效的MySQL查询。这些布尔表达式中的数字表示 tag_id s、 我们希望能够找到 object_id 满足布尔表达式的。

    在这种情况下,如果我们 object1 tag1 tag3 ,但与 tag4 tag5 ,我们会在return语句中得到它。

    同样,如果我们 object2 曾经有过 tag2 标签3 ,但也有 标签4 ,我们不会退还,因为 AND (!4 AND !5) 意味着我们不想要 对象id 如果它有这些标记之一,则返回。

    我认为布尔表达式的逻辑足够简单,但在MySQL中将其转换为不使用一整串EXISTS语句且有些简单的东西似乎并不存在(对我来说,我的经验有限)。

    顺便提一下,表达式可能更高级(和嵌套)。我还将获取此输入并以编程方式对其进行解析。

    与此类似的另一个问题是 Boolean expressions for a tagging system in SQL 。我对这个问题的问题是,它非常具体(我试图采用程序化的方法),对我来说似乎很复杂,但我不确定是否可以避免,因此我写了这个问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    8 年前

    你的问题非常适合使用 group by having 。以下是您的表达方式:

    select ot.object_id
    from objecttag ot
    group by ot.object_id
    having (sum(ot.tagid in (1, 2)) > 0 and
            sum(ot.tagid = 3) > 0)
           ) and
           sum(ot.tagid in (4, 5)) = 0;