Подсчет данных SQL Join из других таблиц - PullRequest
2 голосов
/ 28 октября 2019

У меня есть база данных

Из списка пользователей таблицы

NO NAMA DATE
1  THIS 2019-01-17 18:40:45
2  IS   2019-01-17 18:40:45
3  NAME 2019-02-17 18:40:45

Из текста пользователя таблицы

ID TEXT CREATE
1  THIS 2019-01-18 18:40:45
2  IS   2019-02-21 18:40:45
3  TEXT 2019-03-19 18:40:45

какверните вот так с sql запрос

Month Name Text
Jan   2    1
Feb   1    1
Mar   0    1

я уже пробовал это

SELECT MONTHNAME(userlist.date) as Month, COUNT(userlist.no) as name, COUNT(usertext.id) as text FROM userlist, usertext WHERE MONTH(userlist.date) < 12 AND YEAR(userlist.date) = YEAR(CURRENT_TIMESTAMP) GROUP BY MONTHNAME(date)

и вернул вот так

Month Name Text
Jan   1    1
Feb   1    1
Mar   1    1

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Объединение, затем агрегирование.

SELECT Month, SUM(usr) as Name, SUM(txt) as Text
FROM
(
    SELECT MONTH(t.date) AS monthnum, MONTHNAME(t.date) AS Month, 1 AS usr, 0 AS txt
    FROM userlist t
    WHERE YEAR(t.date) = YEAR(CURRENT_TIMESTAMP) 
      AND MONTH(t.date) < 12 

    UNION ALL

    SELECT MONTH(t.create) AS monthnum, MONTHNAME(t.create) AS Month, 0 AS usr, 1 AS txt
    FROM usertext t
    WHERE YEAR(t.create) = YEAR(CURRENT_TIMESTAMP) 
      AND MONTH(t.create) < 12
) q
GROUP BY monthnum, Month
ORDER BY monthnum 

И ниже небольшой кусочек sql, который генерирует 12 месяцев. Это может быть дополнительный UNION ALL во внутреннем запросе, чтобы заполнить пробелы за пропущенные месяцы.

select n as monthnum, monthname(100*n+1) as month, 0 as usr, 0 as txt
from (
    select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12
) q
3 голосов
/ 28 октября 2019

Вы можете попробовать присоединиться к подзапросу для количества

select  t1.my_month month, t2.count_name, t3.count_text
from( 
  select  month(create ) my_month
  from userlist
  union  
  select  month(create) 
  from usertext
) t1 
left join  (
 select month(create) month, count(*) count_name
 from  userlist 
 group by month(create)
) t2 on t2.month  = t1.my_month
left join  (
 select month(create) month, count(*) count_text
 from  usertext
 group by month(create)
) t3 on t3.month  = t1.my_month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...