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

时间:2016-09-01 01:03:39

标签: mysql sql many-to-many boolean-expression

这可能看起来像一个奇怪的问题,但这里有......

我有一个与此类似的表结构:

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

在这种情况下,如果我们object1tag1tag3,但与tag4tag5没有任何关系,我们会在返回声明中找回它。

同样,如果我们object2tag2tag3,但也有tag4,我们就不会退回,因为AND (!4 AND !5)表示我们不希望object_id返回,如果它有其中一个标签。

我认为布尔表达式的逻辑很简单,但是将它转换为MySQL中没有使用大量EXISTS语句并且有点简单的东西似乎不存在(对我来说,对我而言)有限的经验)。

另外,表达式可能更高级(和嵌套)。我也得到了这个输入并以编程方式解析它。

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

1 个答案:

答案 0 :(得分:1)

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

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;