2016-09-01 58 views
1

這似乎是一個奇怪的問題,但在這裏不用...MySQL多對多設置 - 如何將布爾表達式轉換爲MySQL?

我有一個類似的表結構:

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是有tag1tag3,但沒有任何關係tag4,或tag5,我們會找回來的return語句。

同樣,如果我們有object2是有tag2tag3,但也有tag4,我們不會再回來了,因爲AND (!4 AND !5)意味着我們不希望一個object_id返回,如果它在這些標籤之一。

我認爲布爾表達式的邏輯足夠簡單,但將其轉換爲MySQL中不使用大量EXISTS語句的內容,並且有點簡單,似乎並不存在(對於我而言,經驗)。

在附註上,表達式可能更先進(和嵌套)。我也得到這個輸入並以編程方式解析它。

與此相似的另一個問題是Boolean expressions for a tagging system in SQL。我對這個問題的問題是,它非常具體(我試圖採取一種程序化方法),對我來說似乎相當複雜,但我不確定是否可以避免這種情況,因此我寫了這個問題。

回答

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; 
+0

我不能相信你是如何簡單地做出這個查詢......這太棒了!謝謝您的意見!我真的過分複雜這件事。所以,既然我不知道MySQL的情況,那麼「具有」究竟是做什麼的?我從來沒有見過... –

+1

@NicholausChipping。 。 。 'having'就像'where'子句一樣工作,只有它在* group by之後執行,所以它可以用於聚合函數。 –