创建非自动增量排序键

时间:2012-10-20 11:32:10

标签: mysql sorting auto-increment

目前我需要按以下顺序对3个值进行排序:gameDate,some-column-guarantee-insertion-insertion-order,team score。

显然,将第二个排序参数作为唯一键,第3个排序参数将被忽略。因此,在生产应用程序中,我创建了一个“排序”列,存储了一个非唯一的递增值(请参阅下面的查询结果),然后允许

,而不是按照游戏结果PK ID进行排序。

SORT BY gameDate, sort, total DESC

总分排序首先让我获胜(或绑定)团队,所以我没有

if(teamA.total >= teamB.total) // show winner on left, loser on right

在应用层中生成每周游戏报告。

因此,为了获得我的排序蛋糕,而不是维护中间排序列,似乎日期时间或时间戳可以做到这一点;然而,问题是我需要非唯一的插入日期排序(参与者团队结果行的日期值必须相同),否则,它与游戏结果PK id的排序相同,第3排列将被忽略了。

为什么我需要这样做?要求是最新的游戏结果应该在任何给定的游戏日期最后显示(按游戏日期,PK ID排序),我自己的要求是总计第3列排序是可达的(这也是不可能的一个唯一键列作为第二个排序参数。)

甚至现在这很明显就像泥巴一样; - )

ORIGINAL
我有一个需要在报告中显示的游戏结果列表,按游戏日期排序,然后是固定的排序顺序(即不能对游戏ID进行排序,因为最近显示的游戏必须在报告中的每个日期最后显示)最后通过赢得团队得分。

在当前版本的应用程序中,我使用的是一个int排序列,在游戏结果提交时,会对其进行查询,然后对数据库插入操作加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个不同游戏结果的问题是可能的(这可能导致游戏报告显示不正确)。

无论如何,底线是我需要找到一种按游戏日期排序的方法保留插入顺序,这样我就可以获得游戏团队得分的最后一个排序条款(即通过获胜团队排序) )。

赞赏的想法

由于

2 个答案:

答案 0 :(得分:0)

我的评论进一步讨论:

1)如果您知道每个游戏只有2个团队,则无需以这种方式进行规范化。有点像: gameID,team1ID,team1Total,team2ID,team2Total,tsPosted 可能会更好。

好吧1)现在已经足够了。要提到的是,你可以自己加入一个表,并在不需要应用层逻辑的情况下找到胜利者。

答案 1 :(得分:0)

将插入存储为DateTime似乎更简单,更易于维护(相对于当前的黑客排序列);然后,sort子句变为:

SORT BY gameDate, createDate, gameID, total DESC

其中createDate是非唯一的,这意味着可以访问后续排序列。在这种情况下,即使同时提交了2个单独的游戏结果,也无关紧要,因为gameID排序提供了所需最终排序的网关,即获胜团队; - )

基本上我可以在应用程序层中做到:

games.map(x=> dao.insert(x))

其中游戏结果中的每个参与者团队都具有相同的createDate列的DateTime值。

应该做的诀窍......