Помогите с запросом SQLite - PullRequest
2 голосов
/ 13 сентября 2011

Я пишу приложение для Android и имею довольно простую базу данных SQLite3 (см. Рис.), Но у меня много проблем с конкретным запросом.

Вот (часть) базы данных. Примечание: здесь есть отношение один ко многим. У игрока может быть много событий, но только 1 игрок на каждое событие.

Table model

Я хочу иметь список всех игроков, но мне нужно упорядочить этот список всех игроков по тому, есть ли у них событие с атрибутом Diagnosed, установленным в false или нет (т.е. Все игроки с событием «Undiagnposed» идут вверху, все остальные игроки идут после). Если у них более одного события «Не диагностировано», используется самое новое.

Это самая сложная часть запроса. После этого игроки с событиями «Undiagnposed» должны быть упорядочены по их атрибуту «Magnitude» (int), а другие игроки (любой игрок, у которого нет никаких «неотмеченных» событий), должны быть упорядочены по их фамилии. ,

Вот пример списка, который мне нужен:

  • Игрок <- 1 Не диагностированное событие (100 звездных величин) </li>
  • Игрок <- 2 невыявленных события (новейшая величина 75) </li>
  • Игрок <- 1 Не диагностированное событие (50 звездных величин) </li>
  • Player <- Нет невыявленных событий (Имя: Johnny Appleseed) </li>
  • Игрок <- Нет невыявленных событий (Имя: Джим Зебра) </li>

Единственный способ, которым я могу думать об этом, - это использовать 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;

Единственная проблема сейчас заключается в том, что игроки в нижней части списка (игроки без каких-либо диагностированных событий) сортируются по величине последних событий, а не по фамилии.

1 Ответ

1 голос
/ 13 сентября 2011

что-то вроде:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...