php - LEFT OUTER JOIN SUM 双倍问题

标签 php sql

表:购物

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

表:香蕉

banana_id  banana_amount  banana_person
1    1     Brian
2    1     Brian

我现在想要它打印:

姓名:汤姆 |时间:20 |香蕉:0
姓名:布赖恩 |时间:101 |香蕉:2

我使用了这段代码:

$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>';


}

问题是我得到的是这个:

姓名:汤姆 |时间:20 |香蕉:0
姓名:布赖恩 |时间:202 |香蕉:6

我只是不知道如何解决这个问题。

最佳答案

问题是您正在构建两个表的叉积,将结果乘以对面表中的行数。要解决此问题,请首先计算派生表中一个表的聚合结果,并将此聚合结果连接到另一个表。

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

关于php - LEFT OUTER JOIN SUM 双倍问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639722/

相关文章:

mysql - 检查列值是否在 24 小时前重复触发 IF 语句

mysql - 在一个表的查询中同时选择和计数

PHP/MySQL 使用带有 LIMIT 的 ORDER BY

php - 我怎样才能只允许在 php 中上传某些文件类型?

php - 从给定的 WSDL 创建 PHP SOAP 服务

php - 我的数据未在数据库中获取

php - "No completions available"在 var_

php - 我应该使用@return self、this 还是当前类?

sql 序列计数

java.sql.SQLException : Too many connections (MariaDB)