Как объединить две таблицы в 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

Другие вопросы по тегам