Mysql 如何选择每个月即使他们没有价值
我想从表中选择公司id、日期和编号,但此查询不显示编号为0的某些公司的月份 以下是查询:Mysql 如何选择每个月即使他们没有价值,mysql,sql,Mysql,Sql,我想从表中选择公司id、日期和编号,但此查询不显示编号为0的某些公司的月份 以下是查询: SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*) FROM company c JOIN edited e on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00' GROUP B
SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*)
FROM company c
JOIN edited e
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00'
GROUP BY c.id, date
有些结果与此类似4 16122
4 17_01 4
4 17_04 2
4 17_05 2
没有3月17日。它如何用0来显示17_03?如果您的join根据其in ON子句与值不匹配,not将返回元组,因此您将不会计算行数。如果您有一组固定的公司和日期,则可以使用UNION语句手动设置值:
(SELECT 'company_name1', 'date1', COUNT(*)
FROM company c
JOIN edited e
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00')
UNION
(SELECT 'company_name2', 'date2', COUNT(*)
FROM company c
JOIN edited e
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00')
#and make this for companies that not will return zero at count
UNION
(SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*)
FROM company c
JOIN edited e
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00'
GROUP BY c.id, date)
HugetTable可以是任何具有足够记录数的表,作为显示月份数。您能提供相关表的架构以及示例数据和预期输出吗?我有三个表,companyid 1,name a/id 2,name a/id 3,name c,editedid 1,send_id 1,created 2017-01-01/id2,send_id4,created 2017-02-01/id3,发送id6,created2017-02-22和发送id1,company id1,created2017-01-01/id2,company id1,created2017-02-02/id3,company id1,created2017-05-01/id4,company id1,created2017-02-01/id5,company id2,created2016-12-01/id6,company id2,created2017-02-22在我添加注释时更改了格式,希望你能知道我的意思。对于已编辑的表,公司可能没有每个月的数据,我不确定发送表是否包含每个月的数据。如何为每个月选择值,对于没有值的月份,它可以显示:2017-04 0哪个是计数列下的单元格。谢谢回答。大桌子上应该有所有的记录,但我没有这样的桌子。还有其他查询可以使用吗?只需使用edited as HugeTable即可。我猜。在某些情况下,有一个日期表并不疯狂,因为它可能比动态创建行更有效。检查
SELECT c.id
, ym.y
, ym.m
, count(e.created) cnt
FROM ( SELECT @startDate := date_add(@startDate, interval 1 month) date
, year(@startDate) y
, month(@startDate) m
FROM HugeTable
JOIN ( SELECT @startDate := '2016-11-01'
, @endDate := '2017-05-01'
) months
WHERE @startDate < @endDate
) ym
LEFT JOIN edited e
ON year(e.created) = ym.y
AND month(e.created) = ym.m
LEFT JOIN company c
ON c.id = e.company_id
GROUP BY ym.y
, ym.m
, c.id