在我的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
可以輕鬆獲得一個類別的文章數,但是如何擴展此查詢以檢查兩隻貓?
在我的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
可以輕鬆獲得一個類別的文章數,但是如何擴展此查詢以檢查兩隻貓?
這裏有兩個單向連接(一個連接你要搜索的每個類別):
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
要獲得所有文章(可能有重複)兩類(一和二)
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
編輯:誤讀 - 這個原來的查詢確實存在,如果在任一或類別:
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
。
相同的字段不能同時有兩個不同的值 – 2013-02-08 19:36:07
你需要按產品你的表,然後篩選組爲那些符合所需標準(使用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的如果可能的話,可以使用索引來避免全表掃描。
一個Category_id不能同時有兩個值 – Taryn 2013-02-08 19:29:08
我的歉意,用OR代替 – 2013-02-08 19:31:20
@bluefeet評論說,由於不可能的WHERE子句,這些查詢中的第一個不會返回任何結果(也就是說, category_id'不能同時等於1和2);第二個查詢將返回* * *類別(不是兩個類別)中的每篇文章的記錄,而且每個結果僅包含將該文章與類別1或2相關聯的記錄數。最確定不是OP之後的事情。 -1 – eggyal 2013-02-08 19:41:35