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_id
s。我们希望能够找到所有满足布尔表达式的 object_id
。
在这种情况下,如果我们有 object1
有 tag1
和 tag3
,但与 tag4
或 [=22= 没有任何关系],我们会在 return 语句中取回它。
同样,如果我们有 object2
有 tag2
和 tag3
,但也有 tag4
,我们不会 return,因为AND (!4 AND !5)
表示我们不希望 object_id
returned 如果它具有这些标签之一。
我认为布尔表达式的逻辑很简单,但是把它转换成MySQL中的东西,不使用一大堆EXISTS语句并且有点简单似乎不存在(因为我,以我有限的经验)。
附带说明一下,表达式可能更高级(和嵌套)。我也得到这个输入并以编程方式解析它。
另一个与此类似的问题是 Boolean expressions for a tagging system in SQL。我对这个问题的问题是它非常具体(我正在尝试采用编程方法)并且对我来说似乎很复杂,但我不确定我是否可以避免这种情况,因此我写了这个问题.
您的问题非常适合使用 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;
这似乎是一个奇怪的问题,但这里...
我的 table 结构类似于:
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
或 [=22= 没有任何关系],我们会在 return 语句中取回它。
同样,如果我们有 object2
有 tag2
和 tag3
,但也有 tag4
,我们不会 return,因为AND (!4 AND !5)
表示我们不希望 object_id
returned 如果它具有这些标签之一。
我认为布尔表达式的逻辑很简单,但是把它转换成MySQL中的东西,不使用一大堆EXISTS语句并且有点简单似乎不存在(因为我,以我有限的经验)。
附带说明一下,表达式可能更高级(和嵌套)。我也得到这个输入并以编程方式解析它。
另一个与此类似的问题是 Boolean expressions for a tagging system in SQL。我对这个问题的问题是它非常具体(我正在尝试采用编程方法)并且对我来说似乎很复杂,但我不确定我是否可以避免这种情况,因此我写了这个问题.
您的问题非常适合使用 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;