按月计数和多组 MYSQL

COUNT AND MULTI GROUP BY MONTH MYSQL

请帮助我,我想用 eloquent 显示数据,在此之前我必须创建一个原始查询,以便在我想将它实现到 Eloquent 时更容易。 我想得到这样的结果:

What I want

我试过使用这个查询,但结果不是我想要的。

SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, mpk.nama_kanal, DATE_FORMAT(t.created_at, '%M %Y') tgl
FROM tr_pengaduan AS t
LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
GROUP BY YEAR(t.created_at),MONTH(t.created_at) ORDER BY kanal_id

以上查询结果: Result

以下是 table 的详细信息:

1. Table Tr_pengaduan : Tr_pengaduan

2。 Table ms_pengaduan_kanal : ms_pengaduan_kanal

Is there a way to get the result I want with/without creating a procedure or function? I really appreciate it if you reply with Raw Query or Eloquent or both.


更新: 我尝试了@ProGu 的建议,但连接的结果部分为 NULL。

SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, mpk.nama_kanal, DATE_FORMAT(t.created_at, '%M %Y') tgl, mont.MONTH
FROM tr_pengaduan AS t
LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
LEFT JOIN (SELECT MONTH(CURRENT_DATE()) AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-1 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-2 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-3 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-4 AS
MONTH) AS mont ON MONTH(t.created_at) = mont.MONTH
WHERE t.kanal_id = mpk.kanal_id
GROUP BY mpk.kanal_id ORDER BY kanal_id 

结果:Update Result

尝试这样的事情:

查询中的三个部分

  • month5 - 代表当前月份和前 4 个月
  • t - 结果集的 ID 和名称
  • counts - 统计最近 5 个月的结果

SELECT COALESCE(counts.jml, 0) counts, t.kanal_id, t.nama_kanal, DATE_FORMAT(CURDATE() - INTERVAL month5.months MONTH, '%M %Y') tgl
FROM (
  SELECT 0 AS months
  UNION
  SELECT 1
  UNION
  SELECT 2
  UNION
  SELECT 3
  UNION
  SELECT 4
) month5
CROSS JOIN (
  SELECT t.kanal_id, MAX(mpk.nama_kanal) nama_kanal
  FROM tr_pengaduan t
  LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id
) t
LEFT JOIN (
  SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, DATE(MAX(t.created_at)) tgl
  FROM tr_pengaduan AS t
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id, YEAR(t.created_at), MONTH(t.created_at) 
) counts ON LAST_DAY(counts.tgl) = LAST_DAY(CURDATE() - INTERVAL month5.months MONTH) AND t.kanal_id = counts.kanal_id
ORDER BY kanal_id, tgl