Mysql 多个左连接和求和无法正常工作

Mysql Multiple Left Join And Sum not Working Correctly

我是新加入的。 我想获得 mysql 上的债务和收入总和。但我面临着一个问题。 问题是 sum 比正常情况下更有效。 这是查询

Select uyeler.*,
sum(uye_gider.tutar) as gider,
sum(gelir.tutar) as gelir
from uyeler
LEFT JOIN gelir on gelir.uye=uyeler.id
LEFT JOIN uye_gider on uye_gider.uye=uyeler.id
group by uyeler.id

第一个:

如果我不写 group by 它只会给我第一行。

是这样的吗?

主要问题:

我有:

-2 行 'uye'(用户)

-3行'gelir'(收入)

-1行'uye_gider'(债务)值为25

但是当我执行此查询时,gider 的值为 75。

我认为它的 sum('uye_gider.tutar') 工作了 3 次,因为 'gelir.tutar'

我做错了什么?

------Tables------

CREATE TABLE IF NOT EXISTS `gelir` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tarih` date NOT NULL,
  `uye` int(11) NOT NULL,
  `tutar` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `uyeler` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ad` varchar(15) NOT NULL,
  `soyad` varchar(15) NOT NULL,
  `tc` varchar(11) NOT NULL,
  `dogum` date NOT NULL,
  `cep` int(11) NOT NULL,
  `eposta` varchar(50) NOT NULL,
  `is` int(11) NOT NULL,
  `daire` int(11) NOT NULL,
  `kan` varchar(5) NOT NULL,
  `web` varchar(12) NOT NULL,
  `webpw` varchar(100) NOT NULL,
  `tur` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `uye_gider` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uye` int(11) NOT NULL,
  `tutar` float NOT NULL,
  `gider` int(11) NOT NULL,
  `aciklama` text COLLATE utf8_bin,
  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
---End Tables---

第一

分组依据,根据您选择的字段对数据集进行分组。如果你想要整个 table 的总和,你应该只想要一行,它不应该被任何东西分组。如果你想按一个值对你的总和进行分组,即。 'animals'table

| id | animal | food_eaten |
| 1  | dog    | 10         |
| 2  | cat    | 13         |
| 3  | dog    | 10         |


select animal, sum(food_eaten) as total_food_eaten from animals group by animal; 

会给你

| animal | total_food_eaten |
| dog    | 20               |
| cat    | 13               |

这就是 group by 的工作原理。它根据您选择的非唯一值字段对您的查询进行分段。所以,

 select sum(food_eaten) as total_food_eaten from animals;

会给你

 |total_food_eaten|
 | 33             |

左联接将 return 您所有的左 table 值,无论是否匹配,并且将联接到具有匹配值的任何右联接 table。我可以肯定的是,您有三个收入行与一个用户行相关联。当您执行左连接时,这会生成三个匹配的左连接行。当您然后将债务行加入到这三行时,它可以关联到所有这三行,因为 ID 匹配。这就是给你三连胜的原因。我建议,如果你只是在寻找两者的总和,我建议将查询分开,因为收入和债务 tables 希望在这些 tables 中彼此没有关联。

这可能是一个可以帮助您的答案。

Multiple select statements in Single query