我遇到了问题,无法找到解决方案。
我有一个简单的电视节目表,如下:
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 :(得分: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可伸缩的。所以最后,你想尽可能少地使用它们。
祝你好运