MSQL: как получить 0 счетчиков вместо 1 и ноль с таблицами соединений или представлениями

0

Я пытался подсчитать данные из объединенных представлений, но дал неправильный результат.

Таблица запросов (основная таблица)

+----+----------------------+---------+
| id | title                | history |
+----+----------------------+---------+
|  1 | test search title 2  |       0 |
|  2 | test search title 3  |       1 |
|  3 | test search title 4  |       0 |
|  4 | test search title 5  |       1 |
|  5 | test search title 6  |       0 |
|  6 | test search title 7  |       0 |
|  7 | test search title 8  |       1 |
|  8 | test search title 9  |       0 |
|  9 | test search title 10 |       1 |
+----+----------------------+---------+

Таблица результатов

+------+----------+---------------------+----------+
|  id  | query_id |    published_at     |  status  |
+------+----------+---------------------+----------+
|    1 |       2  | 2017-11-27 12:00:56 | negative |
|    2 |       5  | 2017-12-20 16:17:42 | positive |
|    3 |       6  | 2017-12-20 16:20:22 | positive |
|    4 |       8  | 2017-12-20 16:28:26 | negative |
|    5 |       7  | 2017-12-20 16:29:48 | neutral  |
+------+----------+---------------------+----------+

Я создал 4 представления для подсчета данных по дням и статуса из таблицы results

Ежедневно Всего результатов

CREATE VIEW v_results_daily_total AS (
           SELECT query_id, DATE(published_at) as day, 
            COUNT(*) as total FROM results
            GROUP BY query_id, day)

Ежедневные положительные результаты

CREATE VIEW v_sentiment_daily_positive AS (
           SELECT query_id, DATE(published_at) as day, 
            COUNT(*) as pos FROM results
            WHERE status='positive'
            GROUP BY query_id, day)

Ежедневные отрицательные результаты

CREATE VIEW v_sentiment_daily_negative AS (
               SELECT query_id, DATE(published_at) as day, 
                COUNT(*) as neg FROM results
                WHERE status='negative'
                GROUP BY query_id, day)

Ежедневные нейтральные результаты

CREATE VIEW v_sentiment_daily_neutral AS (
               SELECT query_id, DATE(published_at) as day, 
                COUNT(*) as neg FROM results
                WHERE status='neutral'
                GROUP BY query_id, day)

При попытке запустить следующий запрос он показывает неправильные подсчеты.

select
  q.id,
  q.title,
  vt.day,
  vt.total as total,
  vp.pos as pos,
  vn.neg as neg,
  ve.neu as neu

from queries q
  left join v_results_daily_total vt on vt.query_id=q.id
  LEFT join v_sentiment_daily_positive vp on vp.query_id=q.id
  LEFT join v_sentiment_daily_negative vn on vn.query_id=q.id
  LEFT join v_sentiment_daily_neutral ve on ve.query_id=q.id
WHERE q.history=0
GROUP BY q.id,vt.day;

Неверные результаты

+----+----------------------+------------+-------+------+------+------+
| id | title                |    day     | total | pos  | neg  | neu  |
+----+----------------------+------------+-------+------+------+------+
|  1 | Test Search Title 2  | NULL       | NULL  | NULL | NULL | NULL |
|  3 | Test Search Title 3  | NULL       | NULL  | NULL | NULL | NULL |
| 35 | Test Search Title 11 | NULL       | NULL  | NULL | NULL | NULL |
| 38 | Test Search Title 12 | 2017-12-20 | 17    | 6    | 7    | 4    |
| 38 | Test Search Title 13 | 2017-12-21 | 3     | 6    | 7    | 4    |
| 40 | Test Search Title 14 | NULL       | NULL  | NULL | NULL | NULL |
| 41 | Test Search Title 15 | NULL       | NULL  | NULL | NULL | NULL |
| 51 | Test Search Title 16 | NULL       | NULL  | NULL | NULL | NULL |
| 52 | Test Search Title 17 | NULL       | NULL  | NULL | NULL | NULL |
| 53 | Test Search Title 18 | NULL       | NULL  | NULL | NULL | NULL |
| 57 | Test Search Title 19 | 2017-08-02 | 1     | 1    | 1    | 1    |
| 57 | Test Search Title 20 | 2017-08-06 | 1     | 1    | 1    | 1    |
| 57 | Test Search Title 21 | 2017-12-20 | 4     | 1    | 1    | 1    |
| 58 | Test Search Title 22 | 2017-12-03 | 1     | NULL | NULL | 1    |
| 60 | Test Search Title 23 | NULL       | NULL  | NULL | NULL | NULL |
| 61 | Test Search Title 24 | NULL       | NULL  | NULL | NULL | NULL |
| 62 | Test Search Title 25 | NULL       | NULL  | NULL | NULL | NULL |
| 63 | Test Search Title 26 | NULL       | NULL  | NULL | NULL | NULL |
| 64 | Test Search Title 27 | 2017-12-21 | 133   | 39   | 41   | 53   |
| 67 | Test Search Title 28 | NULL       | NULL  | NULL | NULL | NULL |
| 69 | Test Search Title 29 | 2017-12-12 | 1     | 3    | 1    | NULL |
| 69 | Test Search Title 30 | 2017-12-17 | 3     | 3    | 1    | NULL |
| 69 | Test Search Title 31 | 2017-12-18 | 1     | 3    | 1    | NULL |
| 70 | Test Search Title 32 | 2017-12-12 | 1     | NULL | 3    | 1    |
| 70 | Test Search Title 33 | 2017-12-17 | 3     | NULL | 3    | 1    |
| 70 | Test Search Title 34 | 2017-12-18 | 1     | NULL | 3    | 1    |
| 73 | Test Search Title 35 | 2017-12-17 | 3     | 1    | 1    | 1    |
| 74 | Test Search Title 36 | 2013-10-06 | 1     | 1    | 1    | 1    |
+----+----------------------+------------+-------+------+------+------+

Он дает нулевые дни, если нет результатов, нулевых итогов и неправильного подсчета. Основная проблема - неправильный подсчет. Как его решить?

Теги:

1 ответ

3
Лучший ответ

Не нужно все это. Вы можете просто использовать CASE следующим образом:

select
  DATE(r.published_at) as day,
  SUM(CASE WHEN status = 'negative' THEN 1 ELSE 0 END) AS Negative,
  SUM(CASE WHEN status = 'positive' THEN 1 ELSE 0 END) AS Positive,
  SUM(CASE WHEN status = 'neutral' THEN 1 ELSE 0 END) AS Neutral,
  COUNT(r.id) AS Total
from results as r
left join queries q ON q.id = r.query_id
GROUP BY DATE(r.published_at);

Это даст вам количество статусов и общее количество за каждый день.

Обратите внимание: я использовал таблицу Results в качестве левой таблицы, чтобы получить все дни, даже если в таблице запросов нет результатов. Это зависит только от ваших данных. Таким образом, вы получили нулевые дни в своем первом запросе, потому что таблица результатов была правой таблицей с левым соединением.

Результаты:

|        day | Negative | Positive | Neutral | Total |
|------------|----------|----------|---------|-------|
| 2017-11-27 |        1 |        0 |       0 |     1 |
| 2017-12-20 |        2 |        2 |       0 |     4 |

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

select
  q.id, q.title,
  DATE(r.published_at) as day,
  SUM(CASE WHEN status = 'negative' THEN 1 ELSE 0 END) AS Negative,
  SUM(CASE WHEN status = 'positive' THEN 1 ELSE 0 END) AS Positive,
  SUM(CASE WHEN status = 'neutral' THEN 1 ELSE 0 END) AS Neutral,
  COUNT(r.*) AS Total
from queries q
left join results as r ON q.id = r.query_id
WHERE q.history=0
GROUP BY q.id, q.title, DATE(r.published_at)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню