Как объединить две таблицы в MySQL
У меня есть income
таблица, которая выглядит так:
date income
---------------------------
09/05/13 56000
09/05/13 66600
09/05/13 50000
И expense
таблица, которая выглядит так:
date expense
----------------------------
09/05/13 68800
Я хочу написать запрос, вывод которого выглядит следующим образом:
date income expense
---------------------------------------------
09/05/13 56000 68800
09/05/13 66600
09/05/13 50000
1 ответ
Решение
ОБНОВЛЕНИЕ 2: Если вас не интересует конкретный порядок, в котором значения дохода сопоставляются со значениями расходов, вы можете получить желаемый результат с помощью запроса, подобного этому
SELECT date,
MAX(CASE WHEN type = 1 THEN amount END) income,
MAX(CASE WHEN type = 2 THEN amount END) expense
FROM
(
SELECT 1 type, date, income amount, @n := IF(@g = date, @n + 1, 1) rnum, @g := date g
FROM income CROSS JOIN (SELECT @n := 0, @g := NULL) i1
UNION ALL
SELECT 2, date, expense amount, @m := IF(@f = date, @m + 1, 1) rnum, @f := date g
FROM expense CROSS JOIN (SELECT @m := 0, @f := NULL) i2
) q
GROUP BY date, rnum
Выход:
| ДАТА | ДОХОД | РАСХОД | | -------------------- | -------- | --------- | | 05 сентября 2013 | 56000 | 68800 | | 05 сентября 2013 | 66600 | (ноль) | | 05 сентября 2013 | 50000 | (ноль) |
Вот демоверсия SQLFiddle
ОБНОВЛЕНИЕ 1: Кажется логичным сгруппировать доходы и расходы в день с помощью запроса
SELECT a.date, i.income, e.expense
FROM
(
SELECT date
FROM income
UNION
SELECT date
FROM expense
) a LEFT JOIN
(
SELECT date, SUM(income) income
FROM income
GROUP BY date
) i
ON a.date = i.date LEFT JOIN
(
SELECT date, SUM(expense) expense
FROM expense
GROUP BY date
) e
ON a.date = e.date
Выход:
| ДАТА | ДОХОД | РАСХОД | | -------------------- | -------- | --------- | | 05 сентября 2013 | 172600 | 68800 |
Вот демоверсия SQLFiddle
Оригинальный ответ на оригинальный вопрос: если вам нужно FULL OUTER JOIN
(над date
колонка), как вы указали в исходном вопросе, тогда это будет сделано
SELECT a.date, i.income, e.expense
FROM
(
SELECT date
FROM income
UNION
SELECT date
FROM expense
) a LEFT JOIN income i
ON a.date = i.date LEFT JOIN expense e
ON a.date = e.date
Но тогда вы получите это в качестве вывода
| ДАТА | ДОХОД | РАСХОД | | --------------- | -------- | --------- | | 05 сентября | 56000 | 68800 | | 05 сентября | 66600 | 68800 | | 05 сентября | 50000 | 68800 |
Вот демоверсия SQLFiddle