[英]SQL: get count of articles in two categories
在我的MySQL數據庫中,我有一個表,用於存儲文章和類別的關聯,列為category_id和product_id。 因此,屬於類別#3和#6的商品#5具有(3,5)(6,5)行。
現在,我需要獲取類別1和類別6中的文章數。 SELECT count(category_id) from s_a_c where category_id=1
可以輕松地獲得一個類別中的文章數, 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
您需要按產品對表進行分組,然后針對與所需條件匹配的組過濾組(使用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盡可能使用索引來避免全表掃描。
要獲取兩個類別(一和兩)中的所有文章(可能有重復項)
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,這真的不成熟,沒有看到s_a_c
的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.