Как сложить после подсчета данные в mysql? - PullRequest
1 голос
/ 01 февраля 2020

У меня проблема, когда результат не суммировался для настроения 'neu'. Первый 'neu' от tablea, а второй от tableb. Пожалуйста, помогите мне. У меня есть эта таблица в mysql:

Таблица a

sentid  |   eventid  |  a  |   sentiment  |
-------------------------------------------
1       |    10      | yes |   pos        |
2       |    10      | so  |   neu        |
3       |    11      | me  |   neu        |
4       |    11      | luv |   pos        |
5       |    11      | so  |   neu        |

Таблица b

 bid    |   eventid  |  b  |   sentiment  |
-------------------------------------------
1       |    11      | hee |   pos        |
2       |    11      | yup |   neu        |
3       |    10      | so  |   neu        |
4       |    10      | ha  |   neu        |
5       |    10      | no  |   neu        |

Вывод, который я получил

eventid  |  sentiment   | cnt |
-------------------------------
 10      |   pos        | 1   |
 10      |   neu        | 1   |  #from tablea
 10      |   neu        | 3   |  #from tableb

Желаемый вывод

eventid  |  sentiment   | cnt |
-------------------------------
 10      |   pos        | 1   |
 10      |   neu        | 4   |  

Мой код:

select id,sentiment,count(*) as cnt from tablea WHERE id=10 group by sentiment 
union all 
select id,sentiment,count(*) as cnt from tableb WHERE id=10 group by sentiment

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

UNION сначала, затем агрегируйте.

select eventid, sentiment, count(*) as cnt
from
(
  select eventid, sentiment from tablea
  union all
  select eventid, sentiment from tableb
) unioned
group by eventid, sentiment
order by eventid, sentiment;

Если вы хотите сделать это только для одного eventid, поместите where eventid = 10 после from tablea и from tableb. Вместо этого вы можете поместить его один раз перед group by, но это может быть медленнее.

2 голосов
/ 01 февраля 2020

Сначала вы должны объединиться, затем агрегировать:

SELECT
    eventid,
    sentiment,
    COUNT(*) AS cnt
FROM
(
    SELECT eventid, sentiment FROM tablea
    UNION ALL
    SELECT eventid, sentiment FROM tableb
) t
-- WHERE eventid = 10     -- optional
GROUP BY
    eventid,
    sentiment;
...