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

MySQL many-to-many setup - How to convert boolean expression to MySQL?

这似乎是一个奇怪的问题,但这里...

我的 table 结构类似于:

Object
id, name

Tag
id, name

ObjectTag
object_id, tag_id

我想要做的是采用像

这样的布尔表达式
((1 OR 2) AND (3)) AND (!4 AND !5)

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

在这种情况下,如果我们有 object1tag1tag3,但与 tag4 或 [=22= 没有任何关系],我们会在 return 语句中取回它。

同样,如果我们有 object2tag2tag3,但也有 tag4,我们不会 return,因为AND (!4 AND !5) 表示我们不希望 object_id returned 如果它具有这些标签之一。

我认为布尔表达式的逻辑很简单,但是把它转换成MySQL中的东西,不使用一大堆EXISTS语句并且有点简单似乎不存在(因为我,以我有限的经验)。

附带说明一下,表达式可能更高级(和嵌套)。我也得到这个输入并以编程方式解析它。

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

您的问题非常适合使用 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;