17

私は3つのテーブルを持っています:商品、店、写真。最初のテーブルには、商品のタイトルが格納されています。2番目の-異なる在庫の商品のバランス、3番目の-商品の写真へのリンク。つまり、商品は店舗や写真と1対多のつながりがあります。ここで、1回のクエリで、在庫の合計と写真の数を含む商品のリストを取得する必要があります。私はこのようにしました:

SELECT good.id, good.title, sum(store.rest) AS storerest, count(pics.id) AS picscount 
FROM goods 
LEFT JOIN store ON (goods.id = store.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id`

良いものは0または1枚の写真ですが、すべて問題ないようです。しかし、それが2である場合、ストアレストは2倍になり、その理由がわかりません。どうしたの?

4

3 に答える 3

30

問題は、1つの行に2つ(またはそれ以上)storeの行と2つ(またはそれ以上)picsの行があるgoods場合、行のすべての組み合わせの積になってしまうことです。

これを修正するには、参加する前に集計を行います。

SELECT 
  good.id, 
  good.title, 
  IFNULL(s.storerest, 0) AS storerest, 
  IFNULL(p.picscount, 0) AS picscount
FROM goods 
LEFT JOIN (
  SELECT goodid, sum(rest) AS storerest
  FROM store
  GROUP BY goodid
) s ON (goods.id = s.goodid) 
LEFT JOIN (
  SELECT goodid, count(id) AS picscount
  FROM pics
  GROUP BY goodid
) p ON (goods.id = p.goodid) 
于 2013-02-19T20:56:26.730 に答える
3

テーブル「goods」を他の2つのテーブルと結合しています。ここで、これら2つの他のテーブルは「goods」テーブルに対して1対多の関係にあります。それらが結合されると、行の組み合わせが生成されます。したがって、写真が2つある場合、ストアアイテムは2回リストされます。

これを解決する最も簡単な方法は、最初にサブテーブルの統計を計算し、次にそれらを結合して、一意のアイテムをカウントするときに個別のカウントを使用する場合です。たとえば、クエリは実際には次のようになります。

SELECT good.id, good.title, sum_rest AS storerest, count(distinct pics.id) AS picscount 
FROM goods 
LEFT JOIN (select goodid, sum(rest) as sum_rest from store) s ON (goods.id = s.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id
于 2013-02-19T21:01:57.280 に答える
2

まず、結合のサイズを検討します。1つの商品に2つの写真がある場合、この商品には2倍の行があります。実際には行が複製されますが、画像部分です。したがって、store.restの合計はすべてを2回取得します。3枚の写真を使用すると、3倍の出力が得られます。

于 2013-02-19T20:58:07.133 に答える