Php 创建具有日期列的类似透视图的表的最佳方法

Php 创建具有日期列的类似透视图的表的最佳方法,php,mysql,sql,pivot,Php,Mysql,Sql,Pivot,我有一些包含数据的表,我正在尝试以以下格式生成类似于透视的表: Area | Type | 2013-08-25 | 2013-08-26 | 2013-08-27, etc.. South | Red | 5 | 2 | 9 North | Blue | 3 | 0 | 7 你的方法很好。您可以通过删除if条件来简化它(因为您使用的是MySQL)。布尔值被视为1表示真,被视为0表示假: SELE

我有一些包含数据的表,我正在尝试以以下格式生成类似于透视的表:

Area | Type | 2013-08-25 | 2013-08-26 | 2013-08-27, etc.. South | Red | 5 | 2 | 9 North | Blue | 3 | 0 | 7
你的方法很好。您可以通过删除
if
条件来简化它(因为您使用的是MySQL)。布尔值被视为
1
表示真,被视为
0
表示假:

SELECT iw.display_name as Area, iet.type as `Type`, 
       sum(date(iac.created_at) = '2013-08-25') as `2013-08-25`, 
       sum(date(iac.created_at) = '2013-08-26') as `2013-08-26`, 
       sum(date(iac.created_at) = '2013-08-27') as `2013-08-27`, 
       sum(date(iac.created_at) = '2013-08-28') as `2013-08-28`, 
       sum(date(iac.created_at) = '2013-08-29') as `2013-08-29`, 
       sum(date(iac.created_at) = '2013-08-30') as `2013-08-30`, 
       sum(date(iac.created_at) = '2013-08-31') as `2013-08-31`,  
       count(iac.id) as total 
FROM iac
JOIN ioc on ioc.id = iac.ioc_id
JOIN iet on iet.id = ioc.iet_id
JOIN iw  on  iw.id = iac.iw_id
WHERE iac.created_at >= date('2013-08-25') and iac.created_at < date('2013-09-01')
GROUP BY iw.id, iet.id
ORDER BY iw.display_name, iet.type;
选择iw.display\u name作为区域,选择iet.type作为'type`,
总和(创建日期=2013-08-25)为“2013-08-25”,
总和(创建日期=2013-08-26)为“2013-08-26”,
总和(创建日期=2013-08-27)为“2013-08-27”,
总和(创建日期=2013-08-28)为“2013-08-28”,
总和(创建日期=2013-08-29)为“2013-08-29”,
总和(创建日期=2013年8月30日)为“2013年8月30日”,
总和(创建日期=2013年8月31日)为“2013年8月31日”,
将(iac.id)计为总数
来自iac
在ioc.id=iac.ioc\u id上加入国际奥委会
在iet.id=ioc.iet\u id上加入iet
在iw.id=iac.iw\u id上加入iw
其中iac.created_在>=日期('2013-08-25')和iac.created_在<日期('2013-09-01')时
按iw.id、iet.id分组
按iw.display\u名称、iet.type排序;
我还将列别名中的单引号替换为反引号。只能对字符串常量使用单引号


我还用不等式替换了日期逻辑。这将删除该列周围的函数调用(
date()
),使其更有可能使用索引进行此筛选。

这与MySql中的数据透视功能一样好。通过使用动态SQL实现此查询并将其包装到这样的存储过程中,您可以自己简化事情(以避免每次都键入所有可能的日期)

分隔符$$
创建程序sp_报告(在dt_开始日期,在dt_结束日期)
开始
设置@sql=NULL;
选择组_CONCAT(不同
CONCAT('SUM(当日期(iac.创建时的情况)='',
日期格式(创建于,'%Y-%m-%d'),
''然后1或0结束)'',
日期格式(在“%Y-%m-%d”和“`”处创建)
进入@sql
来自iac
其中iac.created_at>=日期_格式(dt_开始,'%Y-%m-%d00:00')

谢谢你的详细回答。关于WHERE部分有几个问题。日期字符串周围是否需要date()?我认为日期是不必要的,因为字符串已经是日期格式了?iac.created_at字段是日期时间类型,因此MySQL会假定“2013-08-25”为“2013-08-25 00:00:00”,而“2013-08-31”为“2013-08-31 23:59:59”?@John。不,日期不是必需的。至于第二个问题,date相当于时间为0的datetime。这就是为什么第二个值在一天后是一个不等式(我刚刚修正了它)。