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
我是新加入的。 我想获得 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