-1

目前,我需要按以下顺序对 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 个不同的游戏结果的问题是可能的(这可能导致游戏报告显示不正确)。

无论如何,底线是我需要找到一种按比赛日期排序保留插入顺序的方法,这样我就可以获得球队比赛得分的最后一个排序子句(即按获胜球队排序)。

想法赞赏

谢谢

4

2 回答 2

0

从我的评论中进一步讨论:

1) 如果您知道每场比赛只有 2 支球队,则无需以这种方式标准化。类似于:gameID、team1ID、team1Total、team2ID、team2Total、tsPosted 可能会更好。

那么1)现在就足够了。本来要提到的是,您可以自行加入一个表并以这种方式找到获胜者,而无需应用层上的任何逻辑。

于 2012-10-20T11:41:31.573 回答
0

将插入存储为 DateTime 似乎是更容易且更易于维护的方法(与当前存在的黑客排序列相比);然后排序子句变为:

SORT BY gameDate, createDate, gameID, total DESC

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

所以基本上我可以在应用层做:

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

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

应该做的伎俩...

于 2012-10-20T16:06:25.713 回答