我正在构建一个具有记分板的应用程序。 关键是记分牌应该显示他班级中球员的等级。但按最近时间的顺序显示。
我正在尝试使用数据库选择(SQL)执行此操作。
rank name time class how_recent
1. George 2.00 V1 1 min ago
2. Bill 3.00 V1 2 min ago
1. Christoffer 1.00 V2 3 min ago
3. Heini. 3.00 V5 4 min ago
除了排名之外的所有内容都是从数据库中选择的。 我只为班级选择了等级:
SELECT a1._id,
a1.name,
a1.TIME,
COUNT(a2.TIME) rank
FROM players a1,
players a2
WHERE ( ( a1.TIME >= a2.TIME
AND a1.TIME > 0 )
OR ( a1.TIME > 0
AND a1.TIME = a2.TIME
AND a1.name = a2.name ) )
AND a1.TIME > 0
AND a2.TIME > 0
AND a1.class = v1
AND a2.class = v1
GROUP BY a1.name,
a1.TIME
ORDER BY a1.TIME ASC,
a1.name DESC
我在simpleCursorAdapter
中显示,我的问题是:
是否可以在SQL SELECT中或在select和simpleCursorAdapter
之间完成操作?
感谢所有能帮助我的人
答案 0 :(得分:0)
我将假设等级是每个班级中的等级。并且那个时间最短的人排名最高。
假设以下数据:
create table players (time float,
class char(2),
name char(10),
id char(2));
insert into players values (2.0, 'V1', 'George', 1),
(3.0, 'V1', 'Bill', 2),
(1.0, 'V2', 'Chris', 3),
(3.0, 'V5', 'Heini', 4);
然后,以下sql按每个类中的最低时间给出排名:
select a1.id,
a1.name,
a1.time,
a1.class,
(select count(*)
from players a2
where a2.class = a1.class
and a2.time <= a1.time) as rank
from players a1
order by a1.class,
a1.time asc,
rank desc;
这给出了结果:
NAME TIME CLASS RANK
George 2.0 V1 1
Bill 3.0 V1 2
Chris 1.0 V2 1
Heini 3.0 V5 1
通过将第二个连接放入一个子查询,您可以计算每一行相对于同一个类中其他成员的等级。
我很困惑你的例子中的Heini应该得到rank = 3,因为他是class ='V5'的唯一成员,所以我假设这是一个错字,应该是1。
这是你正在寻找的那种结果吗?
<强> - 修改
如果你想让两个与1st相关的人成为#1然后下一个成为#3,那么将其更改为:
select a1.id,
a1.name,
a1.time,
a1.class,
(select count(*) + 1
from players a2
where a2.class = a1.class
and a2.time < a1.time) as rank
from players a1
order by a1.class,
a1.time asc,
rank desc;
时间比较现在是&lt;而不是&lt; =,这消除了对计数(*)中的匹配行的计数,而是将1加回到计数中。具有最低时间的两个将具有0并且<0。比时间+ 1 =排名1.第3将有2个排名领先+ 1,这使他们排名第3。