【问题标题】:mysql select months for 3 years including those with no valuesmysql 选择 3 年的月份,包括没有值的月份
【发布时间】:2017-07-06 23:26:57
【问题描述】:

我有 2 张桌子:月份和初学者

mysql > select * from months
---------------------
| id   | month      |
| ---- | ---------- |
| 1    | 2012-01-31 |
| 2    | 2012-02-29 |
| 3    | 2012-03-31 |
| 4    | 2012-04-30 |
| 5    | 2012-05-31 |
| 6    | 2012-06-30 |
| 7    | 2012-07-31 |
| 8    | 2012-08-31 |
| 9    | 2012-09-30 |
| 10   | 2012-10-31 |
| 11   | 2012-11-30 |
| 12   | 2012-12-31 |
---------------------

从表中查询starter返回

+----------+------------+
|       id | startdate  |
+----------+------------+
|        1 | 2017-07-20 |
|        2 | 2017-07-19 |
|        4 | 2017-07-01 |
|        5 | 2017-06-28 |
|        6 | 2017-05-04 |
|        7 | 2017-04-03 |
|        8 | 2017-01-09 |
|        9 | 2017-02-01 |
|       10 | 2016-01-01 |
|       11 | 2015-01-07 |
|       12 | 2015-01-19 |
|       13 | 2016-02-09 |
+----------+------------+

我将https://stackoverflow.com/a/17916395/8104587修改为:

SELECT concat(date_format(m.month,'%b'),' ',year(CURRENT_DATE())) as Months, 
COUNT(s.id) AS Total FROM months AS m LEFT JOIN starter s ON 
MONTH(m.month) = MONTH(s.startdate) AND YEAR(s.startdate) = 
YEAR(CURRENT_DATE()) GROUP BY m.month

输出:

+----------+-------+
| Months   | Total |
+----------+-------+
| Jan 2017 |     1 |
| Feb 2017 |     1 |
| Mar 2017 |     0 |
| Apr 2017 |     1 |
| May 2017 |     1 |
| Jun 2017 |     1 |
| Jul 2017 |     3 |
| Aug 2017 |     0 |
| Sep 2017 |     0 |
| Oct 2017 |     0 |
| Nov 2017 |     0 |
| Dec 2017 |     0 |
+----------+-------+

我希望能够按此顺序从20152017 生成 3 年

+----------+-------+
| Months   | Total |
+----------+-------+
| Jan 2017 |     1 |
| Jan 2016 |     1 |
| Jan 2015 |     0 |
| Feb 2017 |     1 |
| Feb 2016 |     1 |
| Feb 2015 |     0 |
...
| Dec 2017 |     0 |
| Dec 2016 |     0 |
| Dec 2015 |     0 |
+----------+-------+

我们将不胜感激。

【问题讨论】:

  • 用年份创建另一个表,然后加入它并通过拆分年、月、日并使用新表中的年和现有表中的月、日来生成日期。
  • 改为考虑处理应用代码中数据显示的问题

标签: mysql


【解决方案1】:

你可以得到一个年份和月份的计数表如下:

SET @mn = 1; SET @r = 2015;
SELECT @mn, FLOOR(@yr / 12), CASE
    WHEN @mn = 12 THEN @mn := 1
    WHEN @mn < 12 THEN @mn := @mn + 1 
END,
@yr := @yr + 1 FROM anything WHERE @yr < (2018 * 12)

您可以通过LEFT JOIN 到您的数据表中获取所有年份和月份的列表。也许有更优雅的SELECT-statements 来达到同样的效果,但至少它有效。 anything 是您作为 SELECT 语句的占位符的任何表。为了速度,它应该是一个小的。

【讨论】:

  • 当我对months 表运行此查询时,它返回空集。 mysql&gt; SELECT @mn, FLOOR(@yr / 12), CASE -&gt; WHEN @mn = 12 THEN @mn := 1 -&gt; WHEN @mn &lt; 12 THEN @mn := @mn + 1 -&gt; END, -&gt; @yr := @yr + 1 FROM months WHERE @yr &lt; (2018 * 12) -&gt; ; Empty set (0.00 sec)
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2012-02-24
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多