0

我有一张桌子,可以组织一个节目的节目(每个节目都将在多个节目中进行)。我需要了解它们按时间顺序排列到程序中的位置。

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,而程序不会被截获。基本上,我不想按程序排序,而是按timebegin,而是将所有程序组合在一起。

这是否可以使用纯 mySQL 或者我必须应用服务器端逻辑?

4

4 回答 4

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),然后将查询连接到原始表。然后我们只是 order byfirsttime以使程序组正确排序,并通过timebegin使程序组内的行正确排序。如果两个程序组碰巧有相同的 ,它们之间的program字段就在那里,所以在这种情况下我们不会混合它们。ORDER BYfirsttime

于 2012-08-22T15:41:39.890 回答
0

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

SELECT * FROM show_table 
ORDER BY timebegin, program

如果您希望每次都开始所有程序,请试试这个

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

查看GROUP_CONCAT手册页。

于 2012-08-22T14:09:11.063 回答
0

你试过了ORDER BY timeBegin, program吗?当timeBegin的数据类型为时,这要容易得多DateTime。对?

于 2012-08-22T14:12:21.443 回答
0

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

这些要求相互矛盾。您必须选择哪个列更重要。在先排序时timebegin,程序保持组合在一起的唯一方法是数据恰好按该顺序排列,例如,在另一个程序的两个实例之间没有程序 2 的任何实例发生。这有点令人怀疑。

于 2012-08-22T14:14:01.003 回答