簡體   English   中英

SQL:獲取兩類文章的數量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM