2013-04-11 122 views
0

我遇到问题并找不到解决方案。按日期排列群组日期

我有一个简单的表,电视节目,像这样:

 
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中读取数据?

+0

你可以用'选择工作日(空气)' – fedorqui 2013-04-11 12:01:16

+1

什么口味的SQL服务器您使用的是? – 2013-04-11 12:02:41

+0

'选择 \t id_program为ID, \t标题, \t时间(空气)AS时, \t DAYNAME(空气)AS一周中的某天 从程序,其中标题= '因子' 为了通过时间;' 这是怎么我获取程序和他们的时间,但如果存在像我问的方式组? – Moldaone 2013-04-11 12:03:03

回答

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来得到您想要的结果。像“星期一,星期三,星期五 - 星期六”这样的结果也是可能的。

+0

thnx!而已! – Moldaone 2013-04-11 12:51:02

+0

如果这是你的答案,你应该接受它作为正确的答案。 – 2013-04-11 13:00:37

+1

任务完成:) – Moldaone 2013-04-11 13:02:23

0
select date_format(`air`,'%d-%b %h:%i') from programs 
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 

这是非常草率的工作虽然。我绝不会在实时应用程序中执行此操作。这个逻辑将由业务逻辑而不是数据库来处理。

数据库资源一般是LEASE可扩展的。所以最后,你想尽可能少地使用它们。

好运

+0

Benjamin Paap使用3行代码获得了几乎相同的结果。 – vikingmaster 2013-04-11 12:40:35

+0

你是对的。可悲的是,我用MSSQL来解决这个问题。据我所知,MySQLs group_concat在那里不可用。 – 2013-04-11 12:44:13

+0

thnx!我会考虑你的建议。 – Moldaone 2013-04-11 12:52:07