2011-01-24 18 views
8

Mam tabelę bazy danych, która rejestruje ruchy użytkowników w grze. Za każdym razem, kiedy się poruszam, zapisuję ich identyfikator użytkownika, ruch_indeks (zwiększa każdy wiersz) i id strefy, w której się znajdują. Mam specjalną wartość move_index równą -1, aby wskazać ostatnią część tego użytkownika.wybierz z wyników wybranej opcji

id user_id move_index zone_id 
---------------------------------------------------------------- 
0 11  0   0 
1 11  1   0 
2 11  2   0 
3 11  -1   3  

4 22  0   0 
5 22  1   1 
6 22  2   1  
7 22  -1   3  

chcę zrobić dwie rzeczy z sql:

  • Wykrywanie wszystkich użytkowników, którzy rozpoczął i zakończył w poszczególnych strefach (np rozpoczęła się w strefie 0, a zakończył w strefie 3)
  • Rozszerzanie powyżej, wykryj wszystkich użytkowników, którzy rozpoczęli i zakończyli działania w określonych strefach I przeszli przez określoną strefę.

Wiem, jak to zrobić z wieloma instrukcjami SQL & java - ale nie wiem, jak to zrobić w pojedynczej instrukcji SQL. Czy muszę dokonać wyboru, a następnie wybrać wyniki tego wyboru?

Odpowiedz

10

Możesz po prostu przeprowadzić SUBQUERY, aby osiągnąć to w "pojedynczej" kwerendzie.

np .: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

W istocie, używasz wyniki „wewnętrzny” wybierz jako dane robocze ustawione na „zewnętrzny” SELECT.

+0

Dzięki - wymyśliłem to stąd. Czy jest to standardowy kod SQL (np. Czy działałby on również na Oracle?). A poza kwestią wydajności, czy istnieje jakiś limit liczby PODWÓJNEJ możliwości? – Kevin

+0

Podzapytania Kevin są prawie w każdym RDBMS (nie jestem pewien, jaki standard stanowią część tego, co powiedzieliśmy.) Pod względem limitów, to naprawdę zależy od rozmiaru/kształtu twoich danych, ale generalnie staram się nie używaj więcej niż jednego podkwerendy, o ile to możliwe. (W wielu przypadkach zwykły [JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html) lub czasami [CASE] (http://dev.mysql.com/ doc/refman/5.0/en/case-statement.html) lub tabela tymczasowa może być bardziej odpowiednia.) –

+0

Bardzo jasna i użyteczna odpowiedź. Dzięki za uratowanie mnie dużo pracy. – maartenmachiels

0
select distinct user_id from table where (move_index=0 and zone_id=0) and (move_index=-1 and zone_id=3) 
0

tu idzie zapytanie:

SELECT *, (foo = true AND bar = true) as foobar 
FROM foo 
WHERE (id = 3) 

Można użyć wartości foobar w swoim wyniku kwerendy w celu ustalenia wyniku drugiego równania.

Myślę, że to powinno dać ci wskazówkę, jak to zrobić.

Powiązane problemy