目前,我需要按以下顺序对 3 个值进行排序:gameDate、some-column-that-guarantees-insertion-order、团队得分。
显然,将第二个排序参数作为唯一键,第三个排序参数将被忽略。因此,在生产应用程序中,我创建了一个“排序”列,存储一个非唯一的递增值(参见下面的查询结果),而不是按游戏结果 PK id 排序,然后允许
SORT BY gameDate, sort, total DESC
按总数排序让我首先获得获胜(或平局)球队,所以我不必
if(teamA.total >= teamB.total) // show winner on left, loser on right
在应用层生成每周游戏报告。
因此,为了获得我的排序蛋糕,而不是维护中间排序列,日期时间或时间戳似乎可以解决问题;但是,问题是我需要对插入日期进行非唯一的排序(两个参与者团队结果行的日期值必须相同),否则,它与对游戏结果 PK id 的排序相同,第 3 个排序列将被忽略。
为什么我需要这样做?要求是最近的游戏结果应该在任何给定的游戏日期最后显示(按gameDate,PK id排序),我自己的要求是总的第3列排序是可以达到的(这也是不可能的唯一键列作为第二个排序参数)。
可能即使到现在这也很清楚;-)
原始
我有一个需要在报告中显示的游戏结果列表,按游戏日期排序,然后是固定的排序顺序(即不能按游戏 ID 排序,因为最近显示的游戏必须在报告中的每个日期最后显示) 最后通过获胜的团队得分。
在当前版本的应用程序中,我使用了一个 int 排序列,在提交游戏结果时,会查询该列,然后为 db insert 操作增加 1。最终结果是我可以运行如下查询:
SELECT id, gameID, gameDate, teamID, total, sort
FROM games
ORDER BY gameDate, sort, total desc
+----+--------+------------+--------+-------+------+
| id | gameID | gameDate | teamID | total | sort |
+----+--------+------------+--------+-------+------+
| 1 | 3 | 2011-12-01 | 798 | 6 | 161 |
| 2 | 3 | 2011-12-01 | 106 | 3 | 161 |
| 3 | 4 | 2011-12-01 | 78 | 8 | 162 |
| 4 | 4 | 2011-12-01 | 106 | 7 | 162 |
| 5 | 5 | 2011-12-04 | 106 | 4 | 163 |
| 6 | 5 | 2011-12-04 | 167 | 3 | 163 |
+----+--------+------------+--------+-------+------+
但是,我宁愿不处理维护排序列。是的,我可以在查询中按 gameDate 排序,然后按游戏结果 id PK 排序,并在应用层确定获胜团队排序,做一个if(teamA.total >= teamB.total) ....
,但这也很丑 ;-)
我在想也许 DateTime 或 Timestamp(如果允许非唯一)可能会起作用。有点冒险,因为我记得 MySQL 不处理微秒,所以同时提交 2 个不同的游戏结果的问题是可能的(这可能导致游戏报告显示不正确)。
无论如何,底线是我需要找到一种按比赛日期排序并保留插入顺序的方法,这样我就可以获得球队比赛得分的最后一个排序子句(即按获胜球队排序)。
想法赞赏
谢谢