2011-09-13 177 views
2

我正在为android编写一个应用程序,并且有一个相当简单的SQLite3数据库(请参阅图片),但是我遇到了很多特定查询的麻烦。帮助SQLite查询

这是数据库的一部分。注意:这里有一对多的关系。一名球员可以有许多比赛,但每场比赛只有一名球员。

Table model

我希望有所有的球员名单,但我需要按他们是否有一个具有它的Diagnosed属性设置为false或没有(即一个事件的所有球员这个名单所有参加“未确诊”事件的玩家都会进入最高级别,所有其他玩家都会参加)。如果他们有超过一个“未被诊断”的事件比使用最新的事件。

这是查询最棘手的部分。之后,具有“未诊断”事件的玩家需要按照他们的“量级”属性(int)进行排序,而其他玩家(没有任何“未诊断”事件的玩家)需要按他们的姓氏。

这里的名单,我需要的例子:

  • 球员< --1未确诊的情况下(100级)
  • 球员< --2不明原因的事件(最新的一个75级)
  • 播放器< --1未确诊的情况下(50级)
  • 球员< - 无未确诊的活动(产品名称:约翰尼苹果核战记)
  • 播放器< - 无未确诊的活动(产品名称:吉姆斑马)

我能想到这样做的唯一方法是通过使用两个独立的查询(一个为“不明原因”的玩家,另一个用于其他人),但我不我认为这是做这件事的最好方法。

在此先感谢!

编辑

好了,所以这里是一个的大多是现在的工作查询。现在

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; 

唯一的问题是,在玩家列表(玩家没有任何诊断事件)的底部被其最近的事件幅度,而不是按姓氏排序。

+1

'“我能想到这样做的唯一方法是通过使用2个单独的查询(一个用于“未确诊”的玩家,另一个用于其他人),但我不认为这是做这件事的最佳方式。“不要认为由内联视图和联合组成的查询在某种程度上有缺陷或会表现不佳 - 优化器有时可以用这种查询更容易的时间,而且它们当然更清晰且可维护,因为离散子集更清晰地表示。 – Tim

回答

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)

+0

嘿@Gordatron。谢谢您的帮助!我们对您的查询做了一些调整(这非常好,让我们走上了正轨!),并且它工作得很好。我会在问题中发布更新的代码。只有一个问题......被诊断过的球员也按照他们的大小(如果他们有一个事件)而不是他们的姓氏来排序。任何方式来做'如果诊断== 1,然后按lname命令?我仍然会将此标记为答案,谢谢! – javajavajavajavajava

+0

用一个可能的选项更新了答案..它不会返回关于诊断事件的任何信息 – gordatron