Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: XafiloX en 20 Julio 2011, 19:16 pm



Título: WHERE id IN subquery...
Publicado por: XafiloX en 20 Julio 2011, 19:16 pm
Hola, estoy intentado hacer lo siguiente:

Código
  1. UPDATE dxgm_statspos
  2.   SET total_pos = r.pos
  3.       WHERE id IN (SELECT @rownum := @rownum +1 'pos', id
  4.                        FROM dxgm_users, (SELECT @rownum :=0)r
  5.                        ORDER BY total_points DESC)
  6.           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!



Título: Re: WHERE id IN subquery...
Publicado por: l337* en 20 Julio 2011, 19:49 pm
Hola, estoy intentado hacer lo siguiente:

Código
  1. UPDATE dxgm_statspos
  2.   SET total_pos = r.pos
  3.       WHERE id IN (SELECT @rownum := @rownum +1 'pos', id
  4.                        FROM dxgm_users, (SELECT @rownum :=0)r
  5.                        ORDER BY total_points DESC)
  6.           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
  1. UPDATE dxgm_statspos /* poner esa "pos" en la tabla statspos */
  2. SET total_pos = r.pos   /* poner esa "pos" en la tabla statspos */
  3. WHERE id IN (SELECT id FROM dxgm_users) /*en aquella fila que tiene id igual al id de la tabla users*/
  4.           AND dxgm_statspos.TYPE = 0 /*y type=0 */
  5.  

?


Título: Re: WHERE id IN subquery...
Publicado por: XafiloX en 20 Julio 2011, 19:55 pm
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
  1. SELECT @rownum := @rownum +1 'pos', id
  2.                        FROM dxgm_users, (SELECT @rownum :=0)r
  3.                        ORDER BY total_points DESC
  4.  

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...


Título: Re: WHERE id IN subquery...
Publicado por: l337* en 20 Julio 2011, 20:01 pm
nativamente en sql o con ayuda de algun lenguaje?


Título: Re: WHERE id IN subquery...
Publicado por: Shell Root en 21 Julio 2011, 06:34 am
En que sección pregunto? ¬¬!


Título: Re: WHERE id IN subquery...
Publicado por: XafiloX en 21 Julio 2011, 12:00 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  :-\


Título: Re: WHERE id IN subquery...
Publicado por: l337* en 21 Julio 2011, 15:11 pm
En que sección pregunto? ¬¬!

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



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?


Título: Re: WHERE id IN subquery...
Publicado por: XafiloX en 21 Julio 2011, 20:02 pm
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?


Título: Re: WHERE id IN subquery...
Publicado por: fran800m en 17 Septiembre 2011, 01:42 am
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.