Присоединяйтесь к MySql Tables и SUM

Я пытаюсь написать JOIN Query с 3 таблицами. Мне нужно, чтобы запрос возвращал общую сумму каждого пользователя на основе значения ссылки, переданного в запрос. Добавленный ниже Структура таблицы, требуемый результат и Запрос, который я попробовал.

Таблица 1: UserDetails


|   ID    | Name    | Link    |
|   1     | User A  |    12   |
|   2     | User B  |    12   |
|   3     | User C  |    12   |

Таблица 2: Сохранение


|CreatedBy| Amount  |
|   3     | 100     |
|   3     | 50      |
|   2     | 75      |

Таблица 3: Расходы


|CreatedBy| Amount  |
|   2     | 20      |
|   1     | 15      |
|   3     | 85      |

При передаче значения ссылки в запрос необходимо вернуть итоговое значение (экономия + расходы) для каждого пользователя.

Результат 1: Если передается значение ссылки 12.

Результат запроса будет


|User Name| Total   |
|User A   | 15      |
|User C   | 235     |

Результат 2: При передаче значения ссылки 11.

Результат запроса будет


|User Name| Total   |
|User B   | 95      |

Ниже запрос не возвращает никакого результата.

SELECT
t1.name,
SUM(t2.total_amount+t3.total_amount)
FROM
userdetails t1
LEFT JOIN savings t2
ON t2.created_by=t1.id
LEFT JOIN expense t3
ON t3.created_by=t1.id
WHERE
t1.link=12
AND t1.status=1
AND t2.status=2
AND t3.status=2
GROUP BY
t2.created_by,
t3.created_by

1

Решение

Когда вы делаете внешнее соединение, вы не можете помещать условия в where в противном случае он отменяет внешнее соединение и превращает его в обычное внутреннее соединение. Однако вы можете получить то, что хотите (основываясь на предложении where), добавив условие в соединение следующим образом:

SELECT
t1.name,
SUM(t2.total_amount+t3.total_amount)
FROM
userdetails t1
LEFT JOIN savings t2
ON t2.created_by=t1.id
AND t2.status=2
LEFT JOIN expense t3
ON t3.created_by=t1.id
AND t3.status=2
WHERE
t1.link=12
AND t1.status=1
GROUP BY
t2.created_by,
t3.created_by

Вы также обычно не хотите группировать по полям, которые вы не называете в вашем select пункт:

SELECT
t1.name,
SUM(t2.total_amount+t3.total_amount)
FROM
userdetails t1
LEFT JOIN savings t2
ON t2.created_by=t1.id
AND t2.status=2
LEFT JOIN expense t3
ON t3.created_by=t1.id
AND t3.status=2
WHERE
t1.link=12
AND t1.status=1
GROUP BY
t1.name
0

Другие решения

select
u.Name,
u.link,
c.total
from user_details u,
(select
"created by",
sum(amount) Total
from
(select
"created by",
amount
from expense
union all
select
"created by",
amount
from savings)
group by "created by") c
where u.ID=c."created by"and  u.link=12;
0

Попробуй это:

SELECT A.Name,A.link,B.total
FROM user_details A,
(SELECT 'created by', SUM(amount) AS Total
FROM
(SELECT 'created by',amount
FROM expense
UNION ALL
SELECT'created by',amount
FROM savings)
GROUP BY 'created by') B
WHERE A.ID=B.'created by'
AND A.link=12;

Ты можешь использовать field_name как 'Field Name' или же 'Column Title' отобразить его в результатах.
Убедитесь, что у вас есть столбец created by в таблице.

0
По вопросам рекламы [email protected]