2012-10-20 33 views
-1

目前我有3个值,我需要排序,按照以下顺序:gameDate,某列保证插入顺序,团队得分。创建一个非自动增量排序键

显然,第二个排序参数作为唯一键,第三个排序参数将被忽略。因此,而不是分类,比方说,比赛结果PK ID,在生产应用程序,我创建了一个“之类的”列存储非唯一增加的值(见下面的查询结果),然后允许

SORT BY gameDate, sort, total DESC

凡总排序给我的殊荣(或扎-ING)全队第一,所以我不必

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

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

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

为什么我需要这样做?要求是最近的游戏结果应该在任何给定的游戏日期最后显示(根据gameDate,PK id进行排序),而我自己的要求是第三列排序总数是可达的(这也是不可能的作为第二排序参数的唯一键列)。

大概连现在这是明确的泥;-)

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

在当前版本的应用程序中,我使用了一个int排序列,它在游戏结果提交中被查询,然后为db插入操作增加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) ....,但这也很难看;-)

我在想也许日期时间或时间戳(如果允许非唯一的)可能会诀窍。据我所知,由于MySQL没有处理微秒,因此有点冒险,所以同时提交2个不同游戏结果的问题是可能的(这可能导致游戏报告显示不正确)。

无论如何,底线是,我需要找到一种方法,通过比赛日期排序保持插入顺序,所以我可以在球队的得分游戏(即由获胜的球队排序)最后的排序子句。

想法表示赞赏

感谢

从我的评论
+0

对不起,我不明白你为什么需要排序列开始。您可以使用时间戳来存储和维护输入日期和排序顺序,您的主键可以是('gameID','teamID') – ajacian81

+0

为什么你不想使用自动增量? – Kamil

+0

@Kamil,因为我需要最终的胜利队;如果我按照gameDate排序,接着是游戏表自动增量PK(有一个id列,没有在查询中显示),那么将无法对球队得分排序 – virtualeyes

回答

0

将插入作为DateTime存储似乎是更容易和更易于维护的方法(与当前使用的黑客入侵的排序列相比);排序条款变为:

SORT BY gameDate, createDate, gameID, total DESC 

其中,createDate是非唯一的,这意味着后续的排序列是可到达的。在这种情况下,即使同时提交2个单独的游戏结果,也不会因为游戏ID排序提供通往期望的最终排序的网关,胜利的团队;-)

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

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

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

该做的伎俩...

0

进一步讨论:

1)如果你知道,每场比赛只有2支球队,没有必要以这种方式恢复正常。游戏ID,team1ID,team1Total,team2ID,team2Total,tsPosted 可能会更好一些: 。

那么1)就足够了。我们要提到的是,你可以自己加入一个表格并以这种方式找到赢家,而不需要应用程序层上的任何逻辑。

+0

正确的,祝你好运用这种模式创建汇总报告,不,谢谢;-)唯一的非标准化数据位于复合计划表中,其中生成游戏ID,其中一行具有team1,team2。否则,游戏结果表包含每个团队结果的单独行。有了这些,我可以非常轻松地为联盟排名,得分领袖等创建简单的查询,而不会在OR条件下乱抛垃圾查询 – virtualeyes