Hola, estoy intentado hacer lo siguiente:
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!
Cita de: XafiloX en 20 Julio 2011, 19:16 PM
Hola, estoy intentado hacer lo siguiente:
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...
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 */
?
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:
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...
nativamente en sql o con ayuda de algun lenguaje?
En que sección pregunto? ¬¬!
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 :-\
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?
Pues simplificando y quitando todo lo que no está relacionado la estructura sería algo como
tabla users
id | total_points |
1 | 700 |
2 | 500 |
3 | 1000 |
Entonces la query debería rellenar la tabla statspos así (teniendo que se ordena de forma descendente de puntos):
Respecto a lo del procedure, no estoy muy familiarizado con ellos, pero...no se borran cada vez que reinicias mysql?
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.