2015-05-27 4 views
-2

Я новичок в объединениях. Я хочу получить сумму долгов и доходов на mysql. Но я столкнулся с проблемой. Проблема в сумме работает более чем нормально. Вот запросMysql Несколько Left Join And 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 

Первое:

Если я не пишу группу, это дает мне только первую строку.

Это работает так?

Главная проблема:

у меня есть:

-2 строку 'Üye' (пользователя)

-3 строки 'gelir' (доход)

- 1 строка «uye_gider» (долг) составляет 25

Но когда я выполнить этот запрос значение gider является 75.

Я думаю, что его сумма («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--- 
+0

Я голосую, чтобы закрыть это как неясно, что вы просите. Просьба предоставить некоторые примеры данных и/или SQL Fidlde, которые показывают ожидаемые результаты. – AdamMc331

+0

Добавлены таблицы. ожидаемый результат для гидера - 25. Но я получил 75. –

ответ

1

первый

Группа по, группы наборов данных в соответствии с полем вы выбрали. Если вы хотите получить общую сумму всей таблицы, вам нужна только одна строка, и ее нельзя сгруппировать. Если вы хотите сгруппировать свои суммы на значение, то есть. таблицы 'животных'

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

То есть, как группа по делам. Он разделяет ваши запросы на поле нестандартных значений, которое вы выбираете. так,

select sum(food_eaten) as total_food_eaten from animals; 

даст вам

|total_food_eaten| 
| 33    | 

второго

Левым присоединиться возвращают все ваши левые таблицы значений независимо от спичек и присоединиться к какому-либо праву объединение таблиц со значениями, которые соответствуют. Я уверен в том, что у вас есть три строки дохода, связанные с одной пользовательской строкой. Когда вы выполняете левое соединение, это генерирует три соответствующие строки левого соединения.Когда вы оставите присоединиться к строке долга к этим трем строкам, это может быть связано со всеми тремя, так как ID совпадает. Это то, что дает вам три пета. Я предлагаю, если вы ищете только сумму для обоих, я предлагаю разделить запросы, поскольку таблицы доходов и долговых обязательств не хотят иметь никакой связи друг с другом в этих таблицах.

Это вероятный ответ, который поможет вам на этом пути.

Multiple select statements in Single query

0

Я нашел решение.

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

Я не знаю, почему, но это успешно работает. Отныне я не буду использовать соединение на нескольких таблицах.