Mysql - ПРИСОЕДИНЯЙТЕСЬ к двум таблицам сгруппировать по 2 дат - PullRequest
0 голосов
/ 15 мая 2018

У меня есть две таблицы, которые не связаны внешним ключом, но к которым я хотел бы присоединиться.

Вот два функциональных запроса SQL, к которым я хотел бы присоединиться:

SELECT DATE(added) as 'day', COUNT(*) as 'TopicSub' 
FROM user_subscription 
WHERE topic_id = 39 
GROUP BY DATE(added)


SELECT DATE(date) as 'day', COUNT(*) as 'QSub' 
FROM user_submitted_q 
WHERE question_id IN (SELECT id FROM questions WHERE topic_id = 39) 
GROUP BY DATE(date)

Эти два запроса возвращают результат, включающий общее количество записей, сгруппированных по дням.

Во-первых, дни двух запросов не обязательно совпадают (нет записей для всех дней периода), яхотел бы объединить результаты и иметь 0, если другой столбец не содержит эквивалентную дату.

После многих неудачных попыток со всеми возможными соединениями я нашел этот запрос, который может работать на PostgreSQL:

SELECT * 
FROM 
    (SELECT DATE(date) as 'day', COUNT(*) as 'QSub' 
     FROM user_submitted_q 
     WHERE question_id IN (SELECT id FROM questions WHERE topic_id = 39) 
     GROUP BY DATE(date)) AS q1 
FULL OUTER JOIN  
    (SELECT DATE(added) as 'day', COUNT(*) as 'TopicSub' 
     FROM user_subscription 
     WHERE topic_id = 39 
     GROUP BY DATE(added)) AS q2 ON q1.day = q2.day 
ORDER BY 
    day

Но, к сожалению, я использую Mysql5.7

Вот желаемый результат:

Date       | QSub | TopicSub
-----------+------+---------
2018-02-09 |   5  |   1
2018-02-19 |  19  |  13
2018-02-21 |  12  |   1
2018-02-22 |  43  |   0
2018-02-25 |   0  |   1

Образец user_submitted_q Данные:

+----+---------+-------------+--------+---------------------+----------------+
| id | user_id | question_id | result | date                | ip             |
+----+---------+-------------+--------+---------------------+----------------+
|  1 |       2 |         436 | good   | 2018-02-09 00:13:15 | 176.159.30.253 |
|  2 |       2 |         409 | good   | 2018-02-09 00:13:15 | 176.159.30.253 |
|  3 |       3 |         651 | wrong  | 2018-02-09 00:13:53 | 77.136.14.187  |
|  4 |       3 |         651 | wrong  | 2018-02-09 00:13:53 | 77.136.14.187  |
|  5 |       1 |          96 | wrong  | 2018-02-09 00:21:51 | 77.69.200.124  |
|  6 |       1 |          24 | good   | 2018-02-09 00:21:51 | 77.69.200.124  |
|  7 |       1 |          25 | good   | 2018-02-09 00:21:51 | 77.69.200.124  |
|  8 |       1 |          96 | wrong  | 2018-02-09 00:26:52 | 77.69.200.124  |
|  9 |       1 |          24 | good   | 2018-02-09 00:26:52 | 77.69.200.124  |
| 10 |       1 |          25 | good   | 2018-02-09 00:26:52 | 77.69.200.124  |
+----+---------+-------------+--------+---------------------+----------------+

ОбразецДанные подписки пользователя:

+----+---------+----------+---------------------+
| id | user_id | topic_id | added               |
+----+---------+----------+---------------------+
|  8 |       1 |       39 | 2018-02-09 00:27:30 |
|  9 |       4 |       47 | 2018-02-09 00:42:34 |
| 10 |       4 |       19 | 2018-02-09 00:42:34 |
| 11 |       5 |       47 | 2018-02-09 00:54:14 |
| 13 |       6 |       47 | 2018-02-09 01:00:23 |
| 14 |       6 |       19 | 2018-02-09 01:00:23 |
| 17 |       8 |       47 | 2018-02-09 01:06:50 |
| 18 |       8 |       19 | 2018-02-09 01:06:50 |
| 19 |       9 |       47 | 2018-02-09 01:08:33 |
| 20 |       9 |       19 | 2018-02-09 01:08:33 |
+----+---------+----------+---------------------+

Заранее благодарю за помощь

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Мой SQL не поддерживает полные внешние объединения, но вы можете смоделировать это поведение следующим образом:

Select Col1, Col2, ...
From Table1
Left Join Table 2 on Table1.col = Table2.col

Union

Select Col1, Col2, ...
From Table 1
Right Join Table 2 on Table1.col = Table2.col

Если вы хотите сохранить повторяющиеся строки, вы измените Union на Union All

0 голосов
/ 15 мая 2018

С учетом

MariaDB [sandbox]> select * from t order by dt;
+------------+
| dt         |
+------------+
| 2018-01-01 |
| 2018-01-02 |
| 2018-01-03 |
| 2018-01-03 |
| 2018-01-04 |
| 2018-01-04 |
+------------+
6 rows in set (0.00 sec)

MariaDB [sandbox]> select * from t1 order by dt;
+------------+
| dt         |
+------------+
| 2018-01-02 |
| 2018-01-03 |
| 2018-01-04 |
| 2018-01-05 |
| 2018-01-05 |
| 2018-01-06 |
| 2018-01-06 |
| 2018-01-07 |
| 2018-01-07 |
+------------+
9 rows in set (0.00 sec)

select tu.dt,(select count(*) from t where t.dt = tu.dt) tdt, 
    (Select count(*) from t1 where t1.dt = tu.dt) t1dt 
from
(
select dt from t
union
select dt from t1
) tu;

Устанавливает все даты, охватывающие обе таблицы, а затем подзапросы их подсчитывают.

+------------+------+------+
| dt         | tdt  | t1dt |
+------------+------+------+
| 2018-01-01 |    1 |    0 |
| 2018-01-02 |    1 |    1 |
| 2018-01-03 |    2 |    1 |
| 2018-01-04 |    2 |    1 |
| 2018-01-05 |    0 |    2 |
| 2018-01-06 |    0 |    2 |
| 2018-01-07 |    0 |    2 |
+------------+------+------+
7 rows in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...