Asunto: Update SQL con SELECT anidado para obtener SUM en MySQL
Estoy desarrollando una aplicación web con PHP y MySQL, se trata de una aplicación para un club ciclista, tengo las siguientes tablas y sus campos más importantes:
Como se puede intuir, en la tabla biker_etapa guardo las rutas de bicicleta que se van haciendo con todos sus datos, principalmente los km (kilómetros). Tengo otra tabla "biker_rutasusuario" donde guardo los usuarios que han realizado una determinada ruta, por lo que la tabla "biker_rutasusuario" está enlazada con la tabla "biker_etapa" por los campos "codigoruta" y "codigo" respectivamente. La tabla "biker_rutausuario" también enlaza con la tabla "usuarios" mediante los campos "codigousuario" y "codigo" respectivamente.
Lo que quiero es poder actualizar con un UPDATE (si se puede) el valor "bicikilometros" de la tabla "usuarios" obteniéndolo de la suma de los kilómetros realizados por cada ciclista en cada etapa o ruta.
¿Es posible hacer esto con una sola consulta SQL?
Os pongo la consulta SQL para sacar los kilómetros que ha realizado cada usuario, por si os sirve de algo:
Código:
select nra.codigousuario, sum(be.km)
from biker_rutasusuario nra, biker_etapa be
where be.codigo = nra.codigoruta
group by nra.codigousuario
order by 2 desc
No tengo muchos conocimientos de SQL ¿se puede actualizar un campo de la tabla del UPDATE con el valor obtenido de una SELECT? ¿se puede filtrar esta subselect con el valor de un campo de la tabla del UPDATE?
Publicado:
Dom Oct 09, 2011 10:33 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Update SQL con SELECT anidado para obtener SUM en MySQL
varios escribió:
Estoy desarrollando una aplicación web con PHP y MySQL, se trata de una aplicación para un club ciclista, tengo las siguientes tablas y sus campos más importantes:
Como se puede intuir, en la tabla biker_etapa guardo las rutas de bicicleta que se van haciendo con todos sus datos, principalmente los km (kilómetros). Tengo otra tabla "biker_rutasusuario" donde guardo los usuarios que han realizado una determinada ruta, por lo que la tabla "biker_rutasusuario" está enlazada con la tabla "biker_etapa" por los campos "codigoruta" y "codigo" respectivamente. La tabla "biker_rutausuario" también enlaza con la tabla "usuarios" mediante los campos "codigousuario" y "codigo" respectivamente.
Lo que quiero es poder actualizar con un UPDATE (si se puede) el valor "bicikilometros" de la tabla "usuarios" obteniéndolo de la suma de los kilómetros realizados por cada ciclista en cada etapa o ruta.
¿Es posible hacer esto con una sola consulta SQL?
Os pongo la consulta SQL para sacar los kilómetros que ha realizado cada usuario, por si os sirve de algo:
Código:
select nra.codigousuario, sum(be.km)
from biker_rutasusuario nra, biker_etapa be
where be.codigo = nra.codigoruta
group by nra.codigousuario
order by 2 desc
No tengo muchos conocimientos de SQL ¿se puede actualizar un campo de la tabla del UPDATE con el valor obtenido de una SELECT? ¿se puede filtrar esta subselect con el valor de un campo de la tabla del UPDATE?
Sí que puedes hacerlo con una sola consulta SQL y sí que puedes utilizar el valor devuelto por una SELECT para actualizar un campo de una tabla, también utilizar el filtro que nos comentas.
Para actualizar una tabla obteniendo los datos de otra sería algo así:
Código:
update usuario nu
set nu.bicikilometros=(select sum(be.km)
from biker_rutasusuario nra, biker_etapa be
where be.codigo = nra.codigoruta and
nra.codigousuario = nu.codigo)
Date cuenta que el valor con el que actualizamos el campo "usuario.bicikilometros" es el resultado de otra SELECT "anidada", incluso en esta SELECT anidada usamos como condición de filtro el valor del campo "usuario.codigo" de la tabla que queremos actualizar.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A