2017-07-06 71 views
0

我有2個表:月和起動MySQL的選擇月

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 | 
+----------+-------+ 

我希望能夠在這個順序

+----------+-------+ 
| 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 | 
+----------+-------+ 

任何援助可以理解的產生從2015 3年2017

+0

用這些年份創建另一個表格,然後加入它並通過分割年份,月份,日期以及使用新表格中的年份和現有表格中的月份,日期來生成日期。 –

+0

相反,請考慮處理應用程序代碼 – Strawberry

回答

0

你可以得到年和月計數表如下:

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聲明的佔位符的任何表格。爲了速度,它應該是一個小的。

+0

中的數據顯示問題。當我對'months'表運行此查詢時,它將返回空集。 'mysql> SELECT @mn,FLOOR(@yr/12),CASE - > WHEN @mn = 12 THEN @mn:= 1 - > WHEN @mn <12 THEN @mn:= @mn + 1 - > END, - > @yr:= @yr + 1 FROM months WHERE @yr <(2018 * 12) - >; 空集(0.00秒)' –