0

サブクエリの結果を my と比較して取得する方法でこのクエリを書く方法はありますかcategory_id?

SELECT category_id,
count(id) as TOTAL COUNT, 
(select count(*) from products where product_path LIKE '%Electronics%'
 and category_id = category_id ) as ELECTRONIC COUNT
FROM products
WHERE product_path LIKE '%Products%'
GROUP BY category_id

次の方法で結果が必要です。

"category_id"   "TOTAL COUNT"   "ELECTRONIC COUNT"
   "173"              "1"               "243"
    "42"              "1"               "243"
   "211"              "41"              "243"
   "162"              "10"              "243"
   "172"              "139"             "243"
   "116"              "54"              "243"
    "10"              "3"               "243"

電子カウントをカテゴリに依存させたい。つまり、最初の行は where category_id = 173、2 行目は where category_id = 42、3 行目は wherecategory_id = 211などになります。

4

1 に答える 1

4

相関サブクエリを同じテーブルで機能させるには、テーブルエイリアスを使用する必要があります。

SELECT category_id
      ,count(*) AS total_count  -- unquoted column alias with space is wrong, too
      ,(SELECT count(*)
        FROM   products AS p1
        WHERE  product_path LIKE '%Electronics%'
        AND    p1.category_id = p.category_id
       ) AS electronic_count
FROM   products AS p
WHERE  product_path LIKE '%Products%'
GROUP  BY category_id;

が主キーであると仮定するidと、NOT NULL. その後count(*)、より良い仕事をします。

しかし、これは次のようにさらに単純化できます。

SELECT category_id
      ,count(*) AS total_count -- keyword AS is needed for column alias
      ,count(product_path LIKE '%Electronics%' OR NULL) AS electronic_count
FROM   products p  -- keyword AS is just noise for table alias
WHERE  product_path LIKE '%Products%'
GROUP  BY category_id;

はるかに高速。
count()null 以外の値のみをカウントします。を追加すると、OR NULLに変換FALSEされNULLます。これにより、これらの行のみがカウントされ、 where は にproduct_path LIKE '%Electronics%'評価されTRUEます。

于 2013-11-15T05:28:58.417 に答える