2011-01-24 15 views
8

Ho una tabella di database che registra i movimenti degli utenti in un gioco. Ogni volta che si spostano, registro il loro id utente, il move_index (incrementa ogni riga) e l'id della zona in cui si trovano. Ho uno speciale valore move_index di -1 per indicare l'ultimo movimento di quell'utente.selezionare sui risultati di una selezione

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  

voglio fare due cose con SQL:

  • rilevare tutti gli utenti che hanno iniziato e finito in zone specifiche (ad esempio, ha iniziato in zona 0 e finito in zona 3)
  • Estendere la sopra, rilevare tutti gli utenti che hanno iniziato e terminato in zone specifiche e hanno attraversato una zona specifica.

So come farlo con più istruzioni SQL & java - ma non so come farlo in una singola istruzione SQL. Devo fare una selezione e poi una selezione sui risultati di questa selezione?

risposta

10

Si può semplicemente effettuare un SUBQUERY per raggiungere questo obiettivo all'interno di una query "single".

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

In sostanza, si sta utilizzando i risultati del "interiore" selezionare come dati di lavoro impostati per il "esterno" SELECT.

+0

Grazie - l'ho capito da qui. È questo standard SQL (cioè funzionerebbe anche su Oracle?). E, a parte i problemi di rendimento, c'è qualche limite al numero di SQUADRE che puoi fare? – Kevin

+0

@Kevin Le sottoquery si trovano praticamente in ogni RDBMS (non sono sicuro di quale standard fanno parte di ciò che è stato detto). In termini di limiti, dipende in realtà dalla dimensione/forma dei dati, ma in genere cerco di non utilizzare più di una singola sottoquery, se possibile. (In molti casi un semplice [JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html), o talvolta un [CASE] (http://dev.mysql.com/ doc/refman/5.0/it/case-statement.html) o una tabella temporanea potrebbe essere più appropriata.) –

+0

Risposta molto chiara e utile. Grazie per avermi fatto risparmiare un sacco di lavoro. – 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

qui va la vostra richiesta:

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

È possibile utilizzare il valore foobar nel risultato di una query per determinare il risultato della seconda equazione.

Penso che questo dovrebbe darvi un suggerimento su come farlo.

Problemi correlati