2010-11-11 28 views
6

可以說我有一個與主題有多對多關係的文章表。分配給物品的每個主題都有一個type字段,該字段可以包含AND,NOTOR三個值中的一個。與AND,OR和mysql的查詢

Articles 
    id 
    .... 

Topics 
    id 
    .... 

ArticleTopics 
    article_id 
    topic_id 
    type 

我想創建一個查詢,說的回報是有所有文章:

ALL of the following topics: 1, 2, 3 (AND association) 
    AND 
ANY of the following topics: 4, 5, 6 (OR association) 
    AND 
NONE of the following topics 7, 8 (NOT association) 

如何去創造這個查詢?

在此先感謝!

+0

家庭作業? ...;) – Select0r 2010-11-11 10:59:09

+0

不工作,我在12年左右沒有做過功課! – Lizard 2010-11-11 11:03:54

+0

「ArticleTopics(article_id,topic_id)」是否有唯一索引? 'type'列背後的確切含義是什麼?爲什麼有一個'NOT'類型,而不是在'ArticleTopics'表中沒有條目? – outis 2010-11-11 13:05:17

回答

1

的全部實施,也不是件很簡單的,你只要把它們連有與運算:

SELECT X與Y其中a,b和c不d e和NOT即

和的OR之間去:

SELECT X FROM Y其中((A和B和C)和(d或E或F))AND NOT G和不爲H

替換小的數字與比較,你就完成了。 所以如果你想在代碼中做到這一點,排序你的條件,然後把它們作爲一個字符串鏈接在一起。小心避免SQL插入。

+3

這些字段在關係上,因此它不像這樣簡單。 – 2010-11-11 10:59:24

0

如果我得到這個正確

SELECT * FROM ArticleTopics where type = 'AND' 
UNION 
    SELECT * FROM ArticleTopics where type = 'OR' limit 1 

我想通過「任意」你的意思是「任何一個」。您可以自己將文章加入主題,這很簡單。

0
SELECT a.id, a.name 
    FROM Articles a, ArticleTopics arto 
    WHERE arto.article_id = a.id 
    AND 
     ((arto.topic_id = 1 AND arto.type like 'AND') AND (arto.topic_id = 2 AND arto.type like 'AND') AND (arto.topic_id = 3 AND arto.type like 'AND')) 
    AND 
     ((arto.topic_id = 4 AND arto.type like 'OR') AND (arto.topic_id = 5 AND arto.type like 'OR') AND (arto.topic_id = 6 AND arto.type like 'OR')) 
    AND 
     ((arto.topic_id = 7 AND arto.type like 'NOT') AND (arto.topic_id = 8 AND arto.type like 'NOT')) 
+0

請注意,您可以通過縮進四個空格來將行格式化爲代碼。編輯器工具欄中的「101 \ n010」按鈕可以爲您做到這一點。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2010-11-15 05:25:49