WHERE id IN subquery...

Iniciado por XafiloX, 20 Julio 2011, 19:16 PM

0 Miembros y 2 Visitantes están viendo este tema.

XafiloX

Hola, estoy intentado hacer lo siguiente:

Código (sql) [Seleccionar]
UPDATE dxgm_statspos
   SET total_pos = r.pos
       WHERE id IN (SELECT @rownum := @rownum +1 'pos', id
                        FROM dxgm_users, (SELECT @rownum :=0)r
                        ORDER BY total_points DESC)
           AND dxgm_statspos.type = 0


Más o menos lo que yo quiero que haga es que me ordene la tabla users por total_points y con eso me saque la posicion de cada usuario según ese orden. Esa posicion se guarda en pos. Hasta aquí funciona. Luego intento poner esa "pos" en la tabla statspos en aquella fila que tiene id igual al id de la tabla users y type=0...y ahí ya me da error porque en el IN no puedo meter varias columnas.

La verdad, llevo ya un rato dándole vueltas y me he quedado atrancado en ello, no avanzo más...¿se os ocurre alguna manera de corregirla o alguna manera diferente o más sencilla de hacerla?

Gracias!


l337*

Cita de: XafiloX en 20 Julio 2011, 19:16 PM
Hola, estoy intentado hacer lo siguiente:

Código (sql) [Seleccionar]
UPDATE dxgm_statspos
   SET total_pos = r.pos
       WHERE id IN (SELECT @rownum := @rownum +1 'pos', id
                        FROM dxgm_users, (SELECT @rownum :=0)r
                        ORDER BY total_points DESC)
           AND dxgm_statspos.type = 0


Más o menos lo que yo quiero que haga es que me ordene la tabla users por total_points y con eso me saque la posicion de cada usuario según ese orden. Esa posicion se guarda en pos. Hasta aquí funciona. Luego intento poner esa "pos" en la tabla statspos en aquella fila que tiene id igual al id de la tabla users y type=0...y ahí ya me da error porque en el IN no puedo meter varias columnas.

La verdad, llevo ya un rato dándole vueltas y me he quedado atrancado en ello, no avanzo más...¿se os ocurre alguna manera de corregirla o alguna manera diferente o más sencilla de hacerla?

Gracias!



que tal...

Código (sql) [Seleccionar]

UPDATE dxgm_statspos /* poner esa "pos" en la tabla statspos */
SET total_pos = r.pos   /* poner esa "pos" en la tabla statspos */
WHERE id IN (SELECT id FROM dxgm_users) /*en aquella fila que tiene id igual al id de la tabla users*/
           AND dxgm_statspos.TYPE = 0 /*y type=0 */


?

XafiloX

Pero con eso no haces lo que yo quiero...lo que yo quiero es calcular el la posicion de cada usuario por el orden descendente de puntos totales y luego poner esa posicion en la tabla statspos a la fila con el mismo id que el usuario...


Toda la parte que calcula la posicion está bien:
Código (sql) [Seleccionar]
SELECT @rownum := @rownum +1 'pos', id
                        FROM dxgm_users, (SELECT @rownum :=0)r
                        ORDER BY total_points DESC


En lo que ya me falla es cuando quiero poner esa posicion en la otra tabla, que al usar IN, como le estoy pasando un resultado con varias columnas me da error...

l337*

nativamente en sql o con ayuda de algun lenguaje?

Shell Root

En que sección pregunto? ¬¬!
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

XafiloX

Cita de: l337* en 20 Julio 2011, 20:01 PM
nativamente en sql o con ayuda de algun lenguaje?
En sql...con php podría hacerlo con un bucle con querys, pero me gustaría hacerlo en sql para que vaya más rápido...lo que no sé es si estoy intentado hacer algo que es imposible  :-\

l337*

Cita de: Shell Root en 21 Julio 2011, 06:34 AM
En que sección pregunto? ¬¬!

No sé, ¿¿En qué sección preguntas qué??...




Cita de: XafiloX en 21 Julio 2011, 12:00 PM
En sql...con php podría hacerlo con un bucle con querys, pero me gustaría hacerlo en sql para que vaya más rápido...lo que no sé es si estoy intentado hacer algo que es imposible  :-\

yo diría que con un procedure o ayuda de tablas temporales después de guardar la posición en pos... una muy vaga idea pero al menos es un inicio :p  ¿cómo es la estructura de las tablas que usas?

XafiloX

Pues simplificando y quitando todo lo que no está relacionado la estructura sería algo como

tabla users
idtotal_points
1700
2500
31000

Entonces la query debería rellenar la tabla statspos así (teniendo que se ordena de forma descendente de puntos):


idtypetotal_pos
102
203
301

Respecto a lo del procedure, no estoy muy familiarizado con ellos, pero...no se borran cada vez que reinicias mysql?

fran800m

Los updates te permiten indicar 2 tablas, relacionarlas y cambiar las 2 al mismo tiempo o en tu caso 1 sola, la que te interesa.

Prueba a hacerlo no como subconsulta, sino usando la subquery como tabla auxiliar, así podrás tener de la subquery los campos que necesites.