我想在指定的范围内每个月返回一行 - 我遇到的问题是 - 如果我没有一行则没有任何回复;我想要的是要返回的月份名称和wins_id为空
到目前为止我的查询。
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
问题是我在数据库中没有1月或4月的行 - 但是我还想要一个月回来?
我应该在php中执行这些月份并每个月进行单独查询吗?
答案 0 :(得分:1)
您需要为所有月份制作自定义列:
尝试使用以下内容:
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'
答案 1 :(得分:1)
有很多方法可以在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'];
}
...
答案 2 :(得分:1)
创建一个包含六个月数字的临时表(或者只使用带UNION的SELECT查询) -
CREATE TEMPORARY TABLE months(m INT); INSERT INTO VALUE(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'
答案 3 :(得分:0)
我不确定在MySQL中是否有返回所有月份列表的函数。因此,如果表中缺少任何月份,则无法在运行时获取其月份名称。您可能需要从脚本中传递数月并相应地获取记录。