2010-11-11 62 views
0

這與mysql query with AND, OR and NOT還有mysql has all values我已經解決了AND部分問題,但是現在我現在還需要解決ORNOTmysql complex joins

只是爲了確認下面的語句給我,讓每個題目1,2和3

SELECT x.* 
FROM Article x INNER JOIN 
(SELECT t.article_id, COUNT(t.article_id) 
    FROM articleTopics t 
    WHERE t.topic_id IN ('1','2','3') 
    GROUP BY t.article_id 
    HAVING COUNT(t.article_id)>=3 
    ORDER BY COUNT(t.article_id) DESC 
    LIMIT 0,100) AS ilv 
ON x.id=ilv.article_id 

我所試圖做的就是添加的東西會排除也是所有文章查詢所有文章與主題4和5相關聯:NOT

我還希望添加包含主題6或7的文章,只要它們符合先前的約束。

E.g.

SELECT all Articles where the articles has 
    all the following topics (1,2,3) #AND 
AND 
    none of the following topics (4,5) #NOT 
AND 
    may have any of the following topics(6,7) #OR 

我希望有道理!

+2

如果要求一篇文章必須首先與1/2/3相關聯,我纔看到6和7的關鍵。聽起來像ARTICLETOPCS是一個多對多的表格,所以任何與1/2/3相關的任何東西都會被選中 - 包括那些帶有附加鏈接到6和/或7的東西。 – 2010-11-11 16:39:39

+0

所以你需要文章在哪裏(主題在(1, 2,3)而不是(4,5)中的主題)或(6,7)中的主題? – Sam 2010-11-11 16:41:00

+0

似乎像一個ERD將是有用的這個... – Sonny 2010-11-11 16:43:00

回答

0

這是我結束了:

SELECT x.* 
FROM Article x INNER JOIN 
(SELECT t.article_id, COUNT(t.article_id) 
    FROM articleTopics t 
    WHERE t.topic_id IN ('1','2','3') 
    AND NOT EXISTS (
     SELECT 1 
     FROM articleTopics 
     WHERE article_id = t.article_id 
     AND entity_id IN ('4','5')) 
    GROUP BY t.article_id 
    HAVING COUNT(t.article_id)>=3 
    ORDER BY COUNT(t.article_id) DESC 
    LIMIT 0,100) AS ilv 
ON x.id=ilv.article_id 
LEFT JOIN articleTopics at ON at.article_id = x.id 
WHERE ae_topic_id IN ('6','7') 

這是說所有的文章必須包含所有主題1,2,3和ATLEAST 1 6或7但從不包括4或5

感謝您的幫助。

0

我會用EXISTS功能,如:

SELECT ... 
FROM Article a 
WHERE EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 1) 
    AND EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 2) 
    AND EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 3) 
    AND NOT EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 4) 
    AND NOT EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 5) 
    AND (EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 6) 
    OR EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 7)) 
+0

這將指定該文章必須在主題1,2和3.不是或。我不認爲他在找什麼。 – Cfreak 2010-11-11 16:46:27

+0

@cFreak我在找的文章必須在所有3個主題 – Lizard 2010-11-11 16:47:22

+0

@ Lizard:你應該澄清原來的問題。 IN()相當於OR,因此AND邏輯不起作用。 – Cfreak 2010-11-11 16:50:05

0

好像這將是更易於使用常規JOIN比使用子查詢。應該也更快。

SELECT * FROM articles JOIN articleTopics USING(article_id) 
WHERE topic_id IN(1,2,3) AND topic_id NOT IN (4,5) GROUP BY article_id; 

我不明白爲什麼你需要指定6和7.除非你說它是否有6或7,其他規則並不重要。在這種情況下,你可以這樣做:

SELECT * FROM articles JOIN articleTopics USING(article_id) 
    WHERE (topic_id IN(1,2,3) AND topic_id NOT IN (4,5)) OR topic_id IN(6,7) GROUP BY article_id; 
+0

topic_id IN(1,2,3 )將返回包含這些主題的文章,我需要它包含所有這些主題的文章。與NOT IN相同 – Lizard 2010-11-11 16:46:20