MySQL три таблицы запроса или объединения - PullRequest
0 голосов
/ 11 сентября 2018

У меня 3 таблицы, у них есть общее поле user_id

gain_table

+--------------------------+
|user_id    |   gain_count |
| 1         |   3          |
| 2         |   4          |
| 3         |   1          |
+--------------------------+

потребление_таблицы

+--------------------------+
|user_id    |consume_count |
| 2         |   5          |
| 5         |   4          |
| 6         |   7          |
+--------------------------+

join_table

+--------------------------+
|user_id    |   join_count |
| 1         |   3          |
| 2         |   1          |
| 5         |   4          |
+--------------------------+

Я хочу получить такой вывод:

Выход:

+-----------+--------------+--------------+------------+
|user_id    |   gain_count |consume_count | join_count |
| 1         |   3          |     0        | 3          |
| 2         |   4          |     5        | 1          |
| 3         |   1          |     0        | 0          |
| 5         |   0          |     4        | 4          |
| 6         |   0          |     7        | 0          |
+-----------+--------------+--------------+------------+

Да, я хочу, чтобы эти три таблицы были объединены в одну таблицу, и если какое-либо значение поля пусто, то задайте 0 для этого значения поля.

Как написать запрос MySQL?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете получить желаемый результат с помощью UNION всех таблиц, выбрав 0 для несуществующих значений в каждой таблице и затем суммируя все поля по user_id:

SELECT user_id, SUM(gain_count) AS gain_count, 
    SUM(consume_count) AS consume_count, SUM(join_count) AS join_count
FROM (SELECT user_id, gain_count, 0 AS consume_count, 0 AS join_count FROM gain_table
      UNION ALL
      SELECT user_id, 0, consume_count, 0 FROM consume_table
      UNION ALL
      SELECT user_id, 0, 0, join_count FROM join_table) u
GROUP BY user_id

Выход:

user_id     gain_count  consume_count   join_count
1           3           0               3
2           4           5               1
3           1           0               0
5           0           4               4
6           0           7               0
0 голосов
/ 11 сентября 2018

Вот как это сделать с ANSI-стандартом sql:

SELECT coalesce(g.user_id, c.user_id, j.user_id) user_id
    , coalesce(g.gain_count, 0) gain_count
    , coalesce(c.consume_count, 0) consume_count
    , coalesce(j.join_count,0) join_count
FROM gain_table g
FULL JOIN consume_table c on c.user_id = g.user_id
FULL JOIN join_table j on j.user_id = coalsece(c.user_id, g.user_id)

Это является частью стандарта ANSI с выпуска 92, и любая крупная база данных, кроме MySql, может это делать.MySql должен сделать это вместо:

SELECT ids.user_id
    , coalesce(g.gain_count, 0) gain_count
    , coalesce(c.consume_count, 0) consume_count
    , coalesce(j.join_count, 0) join_count
FROM (
    SELECT user_id FROM gain_table
    UNION
    SELECT user_id FROM consume_table
    UNION
    SELECT user_id FROM join_table
) ids
LEFT JOIN gain_table g on g.user_id = ids.user_id
LEFT JOIN consume_table c on c.user_id = ids.user_id
LEFT JOIN join_table j on j.user_id = ids.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...