按日期分组日期

时间:2013-04-11 11:58:37

标签: php sql

我遇到了问题,无法找到解决方案。

我有一个简单的电视节目表,如下:

CREATE TABLE IF NOT EXISTS programs (
    id_program int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    air datetime, 
    title varchar(50)
);

和表格中的一些行:

2003-10-20 17:00    Factor 
2003-10-21 17:00    Factor 
2003-10-22 17:00    Factor
2003-10-20 19:00    Form
2003-10-21 14:00    Factor

如何获得因子的结果,如下所示:

monday - wednesday : 17.00
tuesday : 14.00;

是否可以在SQL中执行此操作,还是需要在PHP中获取数据?

3 个答案:

答案 0 :(得分:2)

我认为在一个查询中准确得到你想要的东西并不容易。但我找到的东西几乎是你想要的结果:

SELECT TIME(air), title, GROUP_CONCAT(DAYOFWEEK(air)) 
FROM programs WHERE title = 'Factor' 
GROUP BY TIME(air)

这给了我以下结果:

TIME(air)   title   GROUP_CONCAT(DAYOFWEEK(air))
-------------------------------------------------
14:00:00    Factor  3
17:00:00    Factor  2,3,4

使用此结果,您可以轻松利用PHP获得所需的结果。像“星期一,星期三,星期五 - 星期六”这样的结果也是可能的。

答案 1 :(得分:0)

select date_format(`air`,'%d-%b %h:%i') from programs

答案 2 :(得分:0)

这并没有完全回答这个问题,因为这是在MSSQL中。我知道有MySQL风味可以做到这一点

declare @tempTable TABLE (dt_timeOfProgram datetime, str_name varchar(10));

insert into @tempTable values 
('2003-10-20 17:00', 'Factor'),
('2003-10-21 17:00', 'Factor'),
('2003-10-22 17:00', 'Factor'),
('2003-10-20 19:00', 'Form'),
('2003-10-21 14:00', 'Factor');

select
REPLACE(REPLACE(REPLACE(dow, '</dow><dow>', ','), '<dow>',''),'</dow>', '') as DOW
,   [time]
,   [showName]
from (  select distinct
        CAST(dt_timeOfProgram as time) as [time], 
        str_name [showName],
        (   SELECT DATENAME(dw, t1.dt_timeOfProgram) as [dow]
            FROM @tempTable t1 
            where t1.str_name=t2.str_name
            and  CAST(t1.dt_timeOfProgram as time) = CAST(t2.dt_timeOfProgram as time)
            order by t1.dt_timeOfProgram
            for XML PATH('')) [dow]
    from @tempTable t2) as t

这是结果集

Tuesday                     14:00:00.0000000    Factor
Monday,Tuesday,Wednesday    17:00:00.0000000    Factor
Monday                      19:00:00.0000000    Form

这是非常草率的工作。我永远不会在实时应用程序中这样做。这个逻辑将由业务逻辑而不是db来处理。

数据库资源通常是LEASE可伸缩的。所以最后,你想尽可能少地使用它们。

祝你好运