2011-09-13 8 views
2

私はアンドロイド用のアプリケーションを作成していて、かなり単純なSQLite3データベースを持っています(写真参照)が、特定のクエリで多くの問題を抱えています。SQLiteクエリのヘルプ

ここにデータベースの一部です。注:ここには一対多の関係があります。プレーヤーは多くのイベントを持つことができますが、各イベントには1人のプレーヤーしか参加できません。私はすべて選手のリストを持つようにしたいが、私は、彼らはそれが(偽かどうか、すなわちに設定Diagnosed属性のしているイベントがあるかどうかによって、すべてのプレーヤーのリストを注文する必要が

Table model

「診断されていない」イベントを持つすべてのプレイヤーが一番上に、他のすべてのプレイヤーが後に来る)。最新のものよりも複数の「診断されていない」イベントがある場合に使用されます。

これは、クエリの最も難しい部分です。その後、「診断されていない」イベントを持つプレイヤーは、「マグニチュード」属性(int)で注文する必要があり、他のプレイヤー(「未診断」イベントを持たないプレイヤー)は、 。

  • プレーヤー< --1未診断のイベント(100大きさ)
  • プレーヤー< --2未診断のイベント(最新1つの75大きさ)
  • プレーヤー:ここ

    は私が必要とするリストの例です< - 1未診断のイベント(50の大きさ)
  • プレーヤー< - 未診断のイベントはありません(名前:Johnny Appleseed)
  • Player < - 未診断イベント(名前:ジム・ゼブラ)

私はこれをやって考えることができる唯一の方法は、2つの別々のクエリ(「診断未確定」の選手や他の皆のために別のもの)を使用することですが、私はドン」これを行う最良の方法だと思います。

ありがとうございます!

編集

[OK]をので、ここでは主に今働いているクエリがあります。

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つの別々のクエリを使用しています( 1つは「未診断」プレイヤー、もう1人は他のプレイヤー向けです)、これを実行する最善の方法はないと思います」「インラインビューとユニオンからなるクエリは、オプティマイザはそのようなクエリでより簡単な時間を持つことがあり、離散サブセットがより明確に表現されているため、読みやすく、保守性に優れています。 – 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つの問題があります...診断されたプレーヤーは、彼らの姓によってではなく、彼らの大きさによって(イベントを持っていた場合)ソートされます。 '診断された場合== 1、次に' lname'で注文する方法はありますか?私はまだこれを答えとしてマークします、ありがとう! – javajavajavajavajava

+0

は、1つの可能なオプションで回答を更新しました。診断されたイベントに関する情報は返されません – gordatron