Left join, sum and count group by

后端 未结 3 1182
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-04 04:55

I have 3 tables: goods, store and pics. In the first table goods titles are stored. In the second - balance of goods in different stocks, in the third - links to goods pictures.

相关标签:
3条回答
  • 2021-02-04 05:49

    You are joining together table 'goods' with two other tables, where these two other tables have a one-to-many relations to the 'goods' table. When they are joined, a combination of rows will results - so if there are 2 pics then store items are listed twice.

    The easiest way to solve this if you first calculate the stats of the sub-tables and then you join them and use distinct counting when counting unique items, so for example you query should really be:

    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
    
    0 讨论(0)
  • 2021-02-04 05:50

    Your issue is that when you have two (or more) store rows and two (or more) pics rows for a single goods row, you end up with the product of all the combinations of rows.

    To fix this, do your aggregation before joining:

    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) 
    
    0 讨论(0)
  • First consider the size of the join. If there are two pictures for one good then there will be twice as many rows for this good. Actually the rows will be duplicated but for the picture part. Hence the sum of the store.rest will pick up everything twice. With three pictures you would get three times the output.

    0 讨论(0)
提交回复
热议问题