Я пытаюсь написать 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
Когда вы делаете внешнее соединение, вы не можете помещать условия в 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
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;
Попробуй это:
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
в таблице.