0

私は1つのテーブルshop_inventoryと別のテーブルを持っていますshopsDISTINCT zbidfromの数とwhereshop_inventoryの行数を数えたい。私はそれを次のように試しました:shopscid=1 AND zbid!=0

SELECT COUNT(a.cid) shops,COUNT(DISTINCT b.zbid) buyers 
FROM shops a 
JOIN shop_inventory b ON b.cid=a.cid 
WHERE a.zbid!=0 AND a.cid=1

しかし、これは正解である 2 ではなく 100 店舗を返しました。私はどのようJOINに正しく動作するかを理解していないと思います。誰かがこのクエリの修正を提供できますか?

4

2 に答える 2

1

関連する多くのJOIN行が、ショップの数を減らしていました。

この解決策を試してください:

SELECT COUNT(DISTINCT a.cid, a.zbid) shops, 
       COUNT(DISTINCT b.zbid) buyers
FROM   shops a
JOIN   shop_inventory b ON a.cid = b.cid
WHERE  a.cid = 1 AND a.zbid <> 0
于 2012-08-29T20:03:01.310 に答える
0

これで必要なショップの数が得られた場合:

SELECT COUNT(1) AS shops
  FROM shops a
 WHERE a.zbid != 0
   AND a.cid = 1

次に、別のテーブルからカウントを含める 1 つの方法は、相関サブクエリを使用することです。(このアプローチにはいくつかのパフォーマンス上の問題があります。これは、外側のクエリが限られた数の行を返す場合にうまく機能します。)

SELECT COUNT(1) AS shops
     , ( SELECT COUNT(DISTINCT b.zbid)
           FROM shop_inventory b
          WHERE b.cid = a.cid
       ) AS buyers
  FROM shops a
 WHERE a.zbid != 0
   AND a.cid = 1

別のアプローチは、サブクエリの結合 (インライン ビュー) を使用することです...

SELECT COUNT(1) AS shops
     , c.buyers AS buyers
  FROM shops a
  JOIN ( SELECT b.cid, COUNT(DISTINCT b.zbid) AS buyers
           FROM shop_inventory b
          WHERE b.cid = 1
          GROUP BY b.cid
       ) c
 WHERE a.zbid != 0
   AND a.cid = 1
   AND a.cid = c.cid

探している結果セットが返されない場合は、仕様を誤解している可能性があります。

于 2012-08-29T20:14:33.197 に答える