一、需求

image.png
完成上面表的构建,当前月份所有数据查询。

二、构建SQL

思路:

  • 对数据进行group by 分组 ```sql
    1. SELECT
    2. COUNT( 1 ) AS countNumber,
    3. DATE_FORMAT( init_time, '%Y-%m-%d' ) AS dateTime
    4. FROM
    5. camera
    6. WHERE
    7. del_flag = 0
    8. AND init_time <![CDATA[>=]]> date_add( curdate(), INTERVAL - DAY ( curdate())+ 1 DAY )
    9. AND last_day(
    10. curdate())
    11. GROUP BY
    12. # 根据天数分组,但是如果某天没有数据,那么这天的数据就不存在,但是显示需要为空
    13. DATE_FORMAT( init_time, '%Y-%m-%d' )
  1. - 和当前月天数进行连接
  2. ```sql
  3. # 单独获得本月所有天数,用于表的连结
  4. SELECT
  5. ADDDATE( y.FIRST, x.date - 1 ) AS d
  6. FROM
  7. (
  8. SELECT
  9. 1 AS date UNION ALL
  10. SELECT
  11. 2 UNION ALL
  12. SELECT
  13. 3 UNION ALL
  14. SELECT
  15. 4 UNION ALL
  16. SELECT
  17. 5 UNION ALL
  18. SELECT
  19. 6 UNION ALL
  20. SELECT
  21. 7 UNION ALL
  22. SELECT
  23. 8 UNION ALL
  24. SELECT
  25. 9 UNION ALL
  26. SELECT
  27. 10 UNION ALL
  28. SELECT
  29. 11 UNION ALL
  30. SELECT
  31. 12 UNION ALL
  32. SELECT
  33. 13 UNION ALL
  34. SELECT
  35. 14 UNION ALL
  36. SELECT
  37. 15 UNION ALL
  38. SELECT
  39. 16 UNION ALL
  40. SELECT
  41. 17 UNION ALL
  42. SELECT
  43. 18 UNION ALL
  44. SELECT
  45. 19 UNION ALL
  46. SELECT
  47. 20 UNION ALL
  48. SELECT
  49. 21 UNION ALL
  50. SELECT
  51. 22 UNION ALL
  52. SELECT
  53. 23 UNION ALL
  54. SELECT
  55. 24 UNION ALL
  56. SELECT
  57. 25 UNION ALL
  58. SELECT
  59. 26 UNION ALL
  60. SELECT
  61. 27 UNION ALL
  62. SELECT
  63. 28 UNION ALL
  64. SELECT
  65. 29 UNION ALL
  66. SELECT
  67. 30 UNION ALL
  68. SELECT
  69. 31
  70. ) x,
  71. ( SELECT CURDATE() - INTERVAL DAY ( CURDATE()) - 1 DAY AS FIRST, DAY ( LAST_DAY( CURDATE())) AS last ) y
  72. WHERE
  73. x.date <=y.last
  74. ) AS tempDate

整合起来

  1. SELECT
  2. IFNULL(countNumber,0) as counts,d
  3. FROM
  4. (
  5. SELECT
  6. COUNT( 1 ) AS countNumber,
  7. DATE_FORMAT( init_time, '%Y-%m-%d' ) AS dateTime
  8. FROM
  9. camera
  10. WHERE
  11. del_flag = 0
  12. AND init_time <![CDATA[>=]]> date_add( curdate(), INTERVAL - DAY ( curdate())+ 1 DAY )
  13. AND last_day(
  14. curdate())
  15. GROUP BY
  16. DATE_FORMAT( init_time, '%Y-%m-%d' )
  17. ) AS temp1
  18. RIGHT JOIN (
  19. SELECT
  20. ADDDATE( y.FIRST, x.date - 1 ) AS d
  21. FROM
  22. (
  23. SELECT
  24. 1 AS date UNION ALL
  25. SELECT
  26. 2 UNION ALL
  27. SELECT
  28. 3 UNION ALL
  29. SELECT
  30. 4 UNION ALL
  31. SELECT
  32. 5 UNION ALL
  33. SELECT
  34. 6 UNION ALL
  35. SELECT
  36. 7 UNION ALL
  37. SELECT
  38. 8 UNION ALL
  39. SELECT
  40. 9 UNION ALL
  41. SELECT
  42. 10 UNION ALL
  43. SELECT
  44. 11 UNION ALL
  45. SELECT
  46. 12 UNION ALL
  47. SELECT
  48. 13 UNION ALL
  49. SELECT
  50. 14 UNION ALL
  51. SELECT
  52. 15 UNION ALL
  53. SELECT
  54. 16 UNION ALL
  55. SELECT
  56. 17 UNION ALL
  57. SELECT
  58. 18 UNION ALL
  59. SELECT
  60. 19 UNION ALL
  61. SELECT
  62. 20 UNION ALL
  63. SELECT
  64. 21 UNION ALL
  65. SELECT
  66. 22 UNION ALL
  67. SELECT
  68. 23 UNION ALL
  69. SELECT
  70. 24 UNION ALL
  71. SELECT
  72. 25 UNION ALL
  73. SELECT
  74. 26 UNION ALL
  75. SELECT
  76. 27 UNION ALL
  77. SELECT
  78. 28 UNION ALL
  79. SELECT
  80. 29 UNION ALL
  81. SELECT
  82. 30 UNION ALL
  83. SELECT
  84. 31
  85. ) x,
  86. ( SELECT CURDATE() - INTERVAL DAY ( CURDATE()) - 1 DAY AS FIRST, DAY ( LAST_DAY( CURDATE())) AS last ) y
  87. WHERE
  88. x.date <=y.last
  89. ) AS tempDate
  90. ON tempDate.d = temp1.dateTime
  91. ORDER BY tempDate.d

结果如下:
image.png

三、总结分析

  • 在百度过程中,发现一种写法:@data:….只是定义了变量,方便在其他地方引用,在sql中也可以直接使用。 ~~这难道不是函数 ?并不是。。 ~~