我想使用可以在MySQL中使用的PHP创建一个数组。 我的查询看起来像这样......
select
name,
sum(if (tdate='2009-09-09', amount, 0) as day1,
sum(if(tdate='2009-09-10', amount, 0) as day2
...
...
sum(if(tdate='2009-10-01', amount, 0) as day23
from revenue
group by name;
日期范围可能会发生变化,但始终不超过30天。 如果我向PHP数组提供开始和结束日期,它是否能够生成如上所示的查询?
答案 0 :(得分:2)
您应该可以使用分组为您执行此操作:
SELECT name, DATE(tdate) as d, SUM(amount)
FROM revenue
WHERE d >= NOW() AND d < DATE_ADD(NOW(), 30 DAYS)
GROUP BY name, d
这将为您提供新行的每个日期,而不是同一行中的多个字段,但它有望为您提供可行的解决方案。
我认为tdate
是datetime
。 DATE(tdate
)会将其转换为日期(删除时间部分)。另外,将WHERE子句替换为您需要的任何范围。
编辑:好的,所以我们需要为每个名称添加一行,并根据需要添加多个字段。这种表被称为“交叉表”,而MySQL并没有以一种很好的方式真正支持它,但你绝对可以将它一起破解。有关详细信息,请参阅此处:http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html
但是,如果事先知道日期,那么使用PHP将它们放在一起就不会太难了。
// get this list in whichever way you wish
$dates = array("2009-09-09", "2009-09-10", "2009-09-11");
$sql = "SELECT name, "
. "sum(if (tdate='"
. implode("', amount, 0), sum(if (tdate='", $dates)
. "', amount, 0)"
. "FROM revenue "
. "GROUP BY name";
答案 1 :(得分:0)
如果您想生成显示的查询,可以使用PHP中的日期函数来帮助生成字符串:
$dateString1 = date("Y-m-d", $date);
$dateString2 = date("Y-m-d", $date2);
$sql = "select
name,
sum(if (tdate='$dateString1', amount, 0) as day1,
sum(if (tdate='$dateString2', amount, 0) as day2
from revenue
group by name;";
// Run the query as usual...