Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

query liadillo

Estas en el tema de query liadillo en el foro de Mysql en Foros del Web. tengo 3 tablas, 1 contiene los nombres correspondientes a unos códigos y las otras dos, listas de código: tabla1 tabla2 tabla3 t1.codigo = nº cod. ...
  #1 (permalink)  
Antiguo 16/01/2007, 08:11
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
query liadillo

tengo 3 tablas, 1 contiene los nombres correspondientes a unos códigos y las otras dos, listas de código:

tabla1 tabla2 tabla3
t1.codigo = nº cod. t2.codigo = nº cod. t3.codigo = nº cod.
t1.nombre = descripción


bien, lo que busco es un query que me saque todos los elementos de las tabla2 y los de la tabla3, asignando el nombre correspondiente de la tabla 1 y además que no los repita, pero sí que lo sume.

Por ejemplo:

tabla1 tengo: (1, n1), (2, n2), (3, n3)
tabla2 tengo: 1, 1, 2, 2
tabla3 tengo: 1,2,2,3,3,3

tendría que salirme:

n1 - 3
n2 - 4
n3 - 3


gracias a todos
  #2 (permalink)  
Antiguo 16/01/2007, 09:06
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Re: query liadillo

No se pero la estructura me parece incoprensible lo puedes poner de una forma más clara porque así ufffff chungísimo (ahora vendrá uno y dará la solución con esto pro hablar pero a mi me parece que no entiendo nada)

Creo que así es más facil ayudar
Un saludo
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #3 (permalink)  
Antiguo 16/01/2007, 09:41
 
Fecha de Ingreso: junio-2006
Mensajes: 87
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: query liadillo

Lo que entiendo que quieres hacer es que te saque los nombre y que te cuente cuantas veces aparecen en la tabla 2 y 3.

Código:
SELECT t1.nombre, count(*) as nro
from t2,t3,t1,
where t2.cod=t1.cod
and t3.cod=t1.cod
group by t1.nombre
Si no es esto lo que quieres conseguir intenta explicarte mejor.
  #4 (permalink)  
Antiguo 16/01/2007, 16:33
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: query liadillo

vaya, he visto que ha quedado rara la estructura de las tablas, a ver si la pongo mejor para que se vea el tema:

Código:
-----tabla1------            ---tabla2---                    ---tabla3---
|pepe       1           |       1           |                     2
|david      2           |       3           |                     2
|pedro      3           |       1           |                     1 
                                2           |                     3
la forma que comenta seanchan tiene el problema que si la tabla2 o la tabla3 no tienen elementos, pues el query no devuelve nada. Creo que la solución es hacer un UNION pero mi problema es que entonces no consigo el COUNT.

Espero haberme explicado ahora mejor, gracias a todos.
  #5 (permalink)  
Antiguo 17/01/2007, 02:27
 
Fecha de Ingreso: junio-2006
Mensajes: 87
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: query liadillo

Si quieres que aunque no tenga datos salga, lo tienes que hacer la consulta con left join o right join para unir las tablas t1,t2 y t3
  #6 (permalink)  
Antiguo 17/01/2007, 05:04
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: query liadillo

y cómo quedaría el query por favor?
  #7 (permalink)  
Antiguo 17/01/2007, 07:04
 
Fecha de Ingreso: junio-2006
Mensajes: 87
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: query liadillo

Mirandolo, las solución si que es hacer un union, de la otra forma si tienes un valor en la t2 y otro en la t3 no mostraría como número de veces 2 sino 1.

Si tu versión de MySQL admite subconsultas sería una opción
select nombre,sum(nro) as veces
from (select t1.nombre,count(*) as nro
from t2,t1
where t1.cod=t2.cod
group by t1.nombre

union

select t1.nombre,count(*) as nro
from t3,t1
where t1.cod=t3.cod
group by t1.nombre)

group by nombre

Si no permite subselects... pues una funcion o una vista.
  #8 (permalink)  
Antiguo 17/01/2007, 09:01
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: query liadillo

gracias seanchan,

ahora me da este error: "Every derived table must have its own alias"

he probado a hacer el sum(nro+nro2) y dar un alias distinto a cada count en lugar de ambos nro, pero el error persiste.
  #9 (permalink)  
Antiguo 17/01/2007, 10:43
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Re: query liadillo

Pienso que con un LEFT JOIN con UNION te dará en una sóla consulta los dos resultados de esta manera.

Código:
SELECT 
nombre,
count(*) as nro
FROM 
t1
LEFT JOIN t2 ON t2.cod=t1.cod
group by t1.nombre 

UNION 

SELECT 
nombre,
count(*) as nro
FROM 
t1
LEFT JOIN t3 ON t3.cod=t1.cod
group by t1.nombre
Suerte
Un saludo
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa
  #10 (permalink)  
Antiguo 18/01/2007, 21:28
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: query liadillo

Lord of freaks, de esta forma me saca todos los nombres de la tabla1 y siempre me cuenta 1.

:(
  #11 (permalink)  
Antiguo 18/01/2007, 22:31
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: query liadillo

por fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiin

weno la cosa era como sospechaba yo desde un principio y apuntó luego seanchan con un UNION, pero el código que pasó daba el siguiente error:

"Every derived table must have its own alias"

el alias, se refería a cada tabla, pero resulta que para ponerle un alias hay que poner cada salect entre paréntesis () AS ... y el puñetero UNION da error haciendo eso.

He encontrado la solución por en la web de MySQL (mirando mucho) y es hacer un doble SELECT. Aparte para que sume los elementos de las 2 tablas el UNION ha de ser ALL. La cosa quedaría así:

Código:
select nombre,sum(nro) as veces FROM (SELECT * 
from (select t1.nombre,count(*) as nro
from t2,t1
where t1.cod=t2.cod
group by t1.nombre
) AS subtable1
union ALL
SELECT * FROM  (
select t1.nombre,count(*) as nro
from t3,t1
where t1.cod=t3.cod
group by t1.nombre)
AS subtable2 )
AS maintable group by nombre

gracias a todos amiguetes !!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:02.