2012-08-22 57 views
0

我有一个表格来组织程序的显示(每个程序将在多个显示中执行)。我需要有一个观点,他们是按照时间顺序排列的。通过SQL进行多重排序

SQL查询语句是更长的时间真实的,但在很短的:

SELECT * FROM show_table ORDER BY program, timebegin 

结果在该表:

# show_table 

program | timebegin  
3399  Do, 01. Nov. 2012 20 Uhr 
3399  Fr, 02. Nov. 2012 20 Uhr 
3399  Sa, 03. Nov. 2012 20 Uhr 
3401  Do, 08. Nov. 2012 20 Uhr 
3401  Fr, 09. Nov. 2012 20 Uhr 
3401  Sa, 10. Nov. 2012 20 Uhr 
3719  So, 04. Nov. 2012 20 Uhr 
3739  Mo, 12. Nov. 2012 20 Uhr 
3777  So, 04. Nov. 2012 12 Uhr 

因此,程序本身按时间排序,但我想有顺序稍有不同,这样的:

program | timebegin  
3399  Do, 01. Nov. 2012 20 Uhr 
3399  Fr, 02. Nov. 2012 20 Uhr 
3399  Sa, 03. Nov. 2012 20 Uhr 
3777  So, 04. Nov. 2012 12 Uhr 
3719  So, 04. Nov. 2012 20 Uhr 
3401  Do, 08. Nov. 2012 20 Uhr 
3401  Fr, 09. Nov. 2012 20 Uhr 
3401  Sa, 10. Nov. 2012 20 Uhr  
3739  Mo, 12. Nov. 2012 20 Uhr 

现在一切都被有序,而程序不被拦截。基本上,我不想按程序排序,而是通过timebegin,但将所有程序组合在一起。

这是可能的纯mySQL或我必须应用服务器端逻辑?

+2

为什么你不只是'按时间开始订购'?这似乎是你的第二个例子实际上是如何订购的。或者这只是巧合而已? – Crontab

+0

换句话说,如果'ORDER BY timebegin'对你一般不起作用,请修改你的例子来显示一个或多个不正确的工作情况以及正确的输出结果。 –

回答

2

你可以这样说:

SELECT show_table.program, show_table.timebegin 
FROM show_table 
INNER JOIN (
    SELECT program, MIN(timebegin) AS firsttime 
    FROM show_table 
    GROUP BY program 
) AS groups 
ON (show_table.program = groups.program) 
ORDER BY groups.firsttime, show_table.program, show_table.timebegin; 

基本上,还有另一个查询得到的最低timebegin(称为firsttime)为每个程序组,然后将查询连接到原始表。然后我们只需订购firsttime即可正确订购程序组,并按timebegin获取正确排序的程序组内的行。它们之间的program字段ORDER BY在两个程序组碰巧具有相同的firsttime,因此我们不会在这种情况下混合使用它们。

0

看着自己想要的结果,我想你可以使用

SELECT * FROM show_table 
ORDER BY timebegin, program 

如果你想为每一个timebegin所有程序,试试这个

SELECT timebegin, GROUP_CONCAT(program) 
FROM show_table 
GROUP BY timebegin 
ORDER BY timebegin 

看看GROUP_CONCAT手册页。

+0

'ORDER BY timebegin,program'通过timebegin命令所有的东西,并且只对那些节目具有相同时间开始的节目进行排序。 GROUP_CONCAT在我的情况下不起作用,因为我想要这三个步骤: 1.按程序排序所有节目。 2.按时间开始在这些程序包内部进行排序 3.按时间排序对所有这些程序包进行排序 – shredding

0

你试过ORDER BY timeBegin, program?当timeBegin的数据类型为DateTime时更容易。对?

+0

timeBegin实际上是一个时间戳,我为了阅读目的而对它们进行了更改。 – shredding

+0

@shredding很好,你有没有尝试改变顺序列? :) –

+0

是的,请参阅我上面的评论marco。 – shredding

0

基本上,我不想按程序排序,而是按时间排序,但将所有程序组合在一起。

这些要求彼此不一致。您必须选择哪个列更重要。在首先订购timebegin时,程序将保持组合在一起的唯一方式是,如果数据正好按照该顺序,则在另一个程序的两个实例之间没有发生程序2的任何实例。这有些令人怀疑。

相关问题