我正在为android编写一个应用程序,并且有一个相当简单的SQLite3数据库(见图),但是我在使用特定查询时遇到了很多麻烦。
这是数据库的一部分。注意:这里有一对多的关系。玩家可以有很多活动,但每个活动只有1名玩家。
我想要一个所有玩家的列表,但是我需要根据他们是否有一个将Diagnosed
属性设置为false的事件来订购所有玩家的列表。不是(即所有有“未确诊”事件的球员都排在最前面,所有其他球员都排在前面)。如果他们有超过一个“未确诊”事件而不是最新使用的事件。
这是查询中最棘手的部分。之后,“Undiagnosed”事件的玩家需要按照他们的“Magnitude”属性(int)进行排序,其他玩家(任何没有任何“未确诊”事件的玩家)需要按姓氏排序。
以下是我需要的列表示例:
我能想到这样做的唯一方法是使用2个单独的查询(一个用于“未诊断的”玩家,另一个用于其他人)但我认为这不是最好的方法。
提前致谢!
修改
好的,这是现在主要工作的查询。
select player.PlayerID, player.fname, player.lname, stats.diagcount, topmag.magnitude
from player left outer join (
select playerid, MIN(diagnosed) as diagcount
from events group by playerid
)as stats on player.playerid = stats.playerid
left outer join (
select playerid,max(magnitude) as magnitude
from events group by playerid
)as topmag on player.playerid=topmag.playerid
order by CASE WHEN stats.diagcount Is NULL Then 1 Else 0 End,stats.diagcount,topmag.magnitude,lname;
现在唯一的问题是列表底部的玩家(没有任何诊断事件的玩家)按照他们最近的事件数量而不是姓氏进行排序。
答案 0 :(得分:1)
类似的东西:
select player.fname, player.lname, stats.diagcount, topmag.highest
from player left outer join (
select playerid, count(time) as diagcount
from events group by playerid
)as stats on player.playerid = stats.playerid
left outer join (
select playerid,max(magnitude) as highest
from events group by playerid
)as topmag on player.playerid=topmag.playerid
order by stats.diagcount,topmag.highest,lname
不知道什么是sqllite可能,但我认为这样的事情可能有用,如果你发布错误,我会看到我能做什么
如果您希望消除在事件被诊断出的玩家身上按比例排序,那么您可以从子查询中消除它们。
select player.fname, player.lname, stats.diagcount, topmag.highest
from player left outer join (
select playerid, count(time) as diagcount
from events
where diagnosed = 0
group by playerid
)as stats on player.playerid = stats.playerid
left outer join (
select playerid,max(magnitude) as highest
from events
where diagnosed = 0
group by playerid
)as topmag on player.playerid=topmag.playerid
order by stats.diagcount,topmag.highest,lname
抱歉,我的诊断结果可能是错误的(因为它应该被诊断为= 1)