Mysql 在sql中返回日期范围内的项目

Mysql 在sql中返回日期范围内的项目,mysql,Mysql,我希望在指定的范围内每个月返回一行-我遇到的问题是-如果我没有行,就不会返回任何内容;我想要的是返回月份名称,并且winner_id为null 我的问题到目前为止 SELECT MONTHNAME(dated) as Month, winner_id FROM competitions WHERE dated > '2012-01-01' 我希望我的输出看起来像是 Month Winner_id ------------------- January NULL Februar

我希望在指定的范围内每个月返回一行-我遇到的问题是-如果我没有行,就不会返回任何内容;我想要的是返回月份名称,并且winner_id为null

我的问题到目前为止

SELECT MONTHNAME(dated) as Month, winner_id FROM competitions WHERE dated > '2012-01-01'
我希望我的输出看起来像是

Month     Winner_id
-------------------
January   NULL
February  2654
March     19864
April     NULL
问题是我在db中没有1月或4月的行-但我仍然希望返回一个月


我是否应该用php来计算月份,并对每个月进行单独的查询?

我不确定MySQL中是否有返回所有月份列表的函数。因此,最终如果表中缺少任何月份,则无法在运行时获取其月份名称。您可能需要从脚本中减去月份并相应地获取记录。

您需要为所有月份创建一个自定义列:

请尝试以下方法:

  SELECT a,c.Winner_id 
  FROM
   (
    select 'January' as a union all select 'Febuary' union all select 'March'
    union all select 'April' union all select 'May' union all select 'June' union all
    select 'July' union all select 'August' union all select 'September' union all 
    select 'October' union all select 'November' union all select 'December'
    ) as a 
  LEFT JOIN competitions  as c on a.a=monthname(c.dated) 
  WHERE  c.dated > '2012-01-01'

在MySql中有很多方法可以做到这一点,但在您的情况下,这样做太过分了。我将使用您当前查询的变体,并填补php中的空白:

$res = mysql_query( "SELECT MONTH(dated) as month, winner_id".
                    " FROM competitions WHERE dated > '2012-01-01'");
$months = array();
for($i = 1; $i <= 6; ++$i) $month[$i] = 0;
while($r = mysql_fetch_assoc($res)) {
    $month[$r['month']] = $r['winner_id'];
}
...
$res=mysql\u query(“选择月份(日期)作为月份,赢家\u id”。
“来自日期为“2012-01-01”的比赛”;
$months=array();

对于($i=1;$i创建一个临时表,其中包含六个月的数字(或者只使用带有联合的SELECT查询)-

创建临时表月份(m INT); 插入月份值(1)、(2)、(3)、(4)、(5)、(6)

然后将您的表格加入此临时表格,例如-

SELECT t1.m Month, c.winner_id FROM
  (SELECT @m:=MONTH('2012-01-01') + m, IF(@m > 12, @m - 12, @m) m FROM months) t1
  LEFT JOIN competitions c
    ON t1.m = c.MONTH(dated)
WHERE c.dated > '2012-01-01'

如果结果包含了几年的数据呢?接下来的6个月里,比赛每月进行一次,不会包含超过一年的数据。这是我最后使用的方法