2

私のMySQLデータベースには、記事とカテゴリの関連付けを格納するテーブルがあり、列はcategory_idとproduct_idです。したがって、カテゴリ #3 と #6 に属する記事 #5 には行 (3,5)(6,5) があります。

ここで、カテゴリ 1 と 6 の両方に含まれる記事の数を取得する必要があります。1 つのカテゴリの記事の数を取得するのは簡単ですSELECT count(category_id) from s_a_c where category_id=1が、このクエリを拡張して 2 匹の猫をチェックするにはどうすればよいでしょうか?

4

4 に答える 4

2

2 つの結合 (検索するカテゴリごとに 1 つの結合) を使用する 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
于 2013-02-08T19:29:53.917 に答える
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 がインデックスを使用して完全なテーブル スキャンを回避できるようにするために、引き続き句を含めることに注意してください。

于 2013-02-08T19:31:21.567 に答える
-1

2 つのカテゴリ (1 と 2) のすべての記事 (重複する可能性があります) を取得するには

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

2 つのカテゴリ (1 と 2) のすべての記事を (重複なしで) 取得するには

SELECT count(category_id) FROM s_a_c WHERE category_id=1 or category_id=2 GROUP BY article_id
于 2013-02-08T19:28:44.130 に答える
-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、これはすべて本当に時期尚早で、 のスキーマが表示されませんs_a_c

于 2013-02-08T19:28:48.167 に答える