LEFT OUTER JOIN SUM doubles the problem

Table: Shopping

shop_id shop_name  shop_time
1   Brian  40
2   Brian   31
3   Tom   20
4   Brian   30

Table: bananas

banana_id  banana_amount  banana_person
1    1     Brian
2    1     Brian

Now I want it to print:

Name: Tom | Time: 20 | Bananas: 0
Name: Brian | Time: 101 | Bananas: 2

I used this code:

$result = dbquery("SELECT tz.*, tt.*,
SUM(shop_time) as shoptime,
count(banana_amount) as bananas

 FROM shopping tt
 LEFT OUTER JOIN bananas tz ON tt.shop_name=tz.banana_person
 GROUP by banana_person
LIMIT 40
");



while ($data5 = dbarray($result)) {

echo 'Name: '.$data5["shop_name"].' | Time: '.$data5["shoptime"].' | Bananas: '.$data5["bananas"].'<br>';


}

The problem is that I get this instead:

Name: Tom | Time: 20 | Bananas: 0
Name: Brian | Time: 202 | Bananas: 6

I just don't know how to get around this.

+3
source share
3 answers

Using * is a problem (since you are using the by group). Also, SUM (shop_time) is multiplied by so many lines in banaanas, therefore, you get 202 (for two lines in bananas)

Try this query:

SELECT tt.shop_name, 
           SUM(shop_time)           AS shoptime, 
           Ifnull(banana_amount, 0) AS bananas 
    FROM   shop tt 
           LEFT OUTER JOIN (SELECT banana_person, 
                                   SUM(banana_amount) AS banana_amount 
                            FROM   bananas 
                            GROUP  BY banana_person) tz 
             ON tt.shop_name = tz.banana_person 
    GROUP  BY shop_name; 
+1
source

, , . , .

SELECT
    shop_name,
    shoptime,
    IFNULL(SUM(banana_amount), 0)
FROM (
    SELECT shop_name, SUM(shop_time) as shoptime
    FROM shopping
    GROUP BY shop_name
) tt
LEFT JOIN bananas tz ON tt.shop_name=tz.banana_person
GROUP BY shop_name
+3
select
      xx.shop_name
    , xx.tot_time
    , coalesce(yy.tot_bananas, 0) as tot_bananas
from
(
    select
          shop_name
        , sum(shop_time) as tot_time
    from shopping
    group by shop_name
) as xx
left join
(
    select
          banana_person
        , sum(banana_amount) as tot_bananas
    from bananas
    group by banana_amount
) as yy on xx.shop_name = yy.banana_person
order by xx.shop_name
;
+1
source

Source: https://habr.com/ru/post/1784375/


All Articles