目前我需要按以下顺序对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个不同游戏结果的问题是可能的(这可能导致游戏报告显示不正确)。
无论如何,底线是我需要找到一种按游戏日期排序的方法和保留插入顺序,这样我就可以获得游戏团队得分的最后一个排序条款(即通过获胜团队排序) )。
赞赏的想法
由于
答案 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值。
应该做的诀窍......