2013-02-08 36 views
2

在我的MySQL數據庫中,我有一個存儲文章和類別關聯的表,列是category_id和product_id。因此,屬於類別#3和#6的文章#5具有行(3,5)(6,5)。SQL:獲得兩類文章的計數

現在我需要獲得同類型1和類別6的文章數。通過SELECT count(category_id) from s_a_c where category_id=1可以輕鬆獲得一個類別的文章數,但是如何擴展此查詢以檢查兩隻貓?

回答

2

這裏有兩個單向連接(一個連接你要搜索的每個類別):

SELECT COUNT(1) 
FROM articles 
INNER JOIN s_a_c c1 ON articles.product_id = c1.product_id 
    AND c1.category_id = 1 
INNER JOIN s_a_c c2 ON articles.product_id = c2.product_id 
    AND c2.category_id = 6 

這裏還有一個HAVING條款的另一種方式。派生表將s_a_c中的所有產品與類別1和6一起提供,並且都具有(COUNT(1) = 2)。這需要的事實{product_id, category_id}將是獨特的優勢:

SELECT COUNT(1) 
FROM 
(
    SELECT product_id 
    FROM s_a_c 
    WHERE category_id IN (1,6) 
    GROUP BY product_id 
    HAVING COUNT(1) = 2 
) x 
-1

要獲得所有文章(可能有重複)兩類(一和二)

SELECT count(category_id) from s_a_c where category_id=1 or category_id=2 

要獲得所有文章(不重複)兩類(一和二)

SELECT count(category_id) FROM s_a_c WHERE category_id=1 or category_id=2 GROUP BY article_id 
+2

一個Category_id不能同時有兩個值 – Taryn 2013-02-08 19:29:08

+0

我的歉意,用OR代替 – 2013-02-08 19:31:20

+0

@bluefeet評論說,由於不可能的WHERE子句,這些查詢中的第一個不會返回任何結果(也就是說, category_id'不能同時等於1和2);第二個查詢將返回* * *類別(不是兩個類別)中的每篇文章的記錄,而且每個結果僅包含將該文章與類別1或2相關聯的記錄數。最確定不是OP之後的事情。 -1 – eggyal 2013-02-08 19:41:35

-1

編輯:誤讀 - 這個原來的查詢確實存在,如果在任一或類別:

SELECT COUNT(*) FROM s_a_c WHERE category_id IN (1,6);

現有兩個類別正確的查詢:

SELECT COUNT(*) FROM s_a_c WHERE category_id = 1 AND category_id 6;

TBH,這一切真的過早W/O看到架構s_a_c

+2

相同的字段不能同時有兩個不同的值 – 2013-02-08 19:36:07

1

你需要按產品你的表,然後篩選組爲那些符合所需標準(使用HAVING條款,這是後評估分組而WHERE子句進行評估之前分組):

SELECT COUNT(*) FROM (
    SELECT article_id 
    FROM  s_a_c 
    WHERE category_id IN (1,6) 
    GROUP BY product_id 
    HAVING COUNT(DISTINCT category_id) = 2 
) t 

如果(product_id,category_id)被保證是唯一的(例如。通過由UNIQUE鍵執行的唯一性約束),您可以使用更高性能的COUNT(*)代替COUNT(DISTINCT category_id)

如果您需要實現對組過濾器更復雜的邏輯,你可以利用MySQL的缺乏真正的布爾類型的這樣:

SELECT article_id 
FROM  s_a_c 
WHERE category_id IN (1,3,6) 
GROUP BY product_id 
HAVING SUM(category_id = 1) 
    AND SUM(category_id = 6) 
    AND NOT SUM(category_id = 3) 

注意,我繼續包括WHERE條款,以便MySQL的如果可能的話,可以使用索引來避免全表掃描。