2011-09-13 223 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