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.
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
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)
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.