2011-01-24 14 views
8

Tengo una tabla de base de datos que registra los movimientos de los usuarios en un juego. Cada vez que se mueven, registro su ID de usuario, el índice de movimiento (incrementa cada fila) y el ID de la zona en la que se encuentran. Tengo un valor especial de índice_de movimiento de -1 para indicar el último movimiento de ese usuario.seleccionar en los resultados de un seleccionar

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  

Quiero hacer dos cosas con SQL:

  • detectar todos los usuarios que empezó y terminó en zonas específicas (por ejemplo, se inició en la zona 0 y terminó en la zona 3)
  • La extensión de la arriba, detectar a todos los usuarios que comenzaron y terminaron en zonas específicas Y pasaron a través de una zona específica.

Sé cómo hacer esto con múltiples declaraciones SQL & java - pero no sé cómo hacer esto en una sola declaración SQL. ¿Debo hacer una selección y luego seleccionar en los resultados de esta selección?

Respuesta

10

Simplemente puede realizar un SUBQUERY para lograr esto en una consulta "única".

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

En esencia, usted está utilizando los resultados del "interior" Seleccionar como los datos de trabajo establecidos para el "exterior" SELECT.

+0

Gracias - Lo imaginé desde aquí. ¿Es este SQL estándar (es decir, ¿funcionaría también en Oracle?). Y, aparte de los problemas de rendimiento, ¿existe algún límite en la cantidad de SUBCUENTAS que puede hacer? – Kevin

+0

@Kevin Las subconsultas son en casi todos los RDBMS (no estoy seguro de qué estándar son parte de eso). En términos de límites, realmente depende del tamaño/forma de tus datos, pero generalmente trato de no use más de una única subconsulta si es posible. (En muchos casos, un simple [JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html), o a veces un [CASE] (http://dev.mysql.com/ doc/refman/5.0/es/case-statement.html) o una tabla temporal puede ser más apropiada.) –

+0

Respuesta muy clara y útil. Gracias por ahorrarme mucho trabajo. – 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

aquí va su consulta:

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

Usted puede utilizar el valor foobar en su resultado de la consulta para determinar el resultado de la segunda ecuación.

Creo que esto debería darle una pista sobre cómo hacerlo.

Cuestiones relacionadas