Comunidad de diseño web y desarrollo en internet online

Consulta un tanto extraña en MySQL

Citar            
MensajeEscrito el 24 May 2008 10:16 am
Despues de estar varios días rompiendome la cabeza para hacer una consulta recurro a los expertos a ver si alguno tiene una solucion....

El tema es el siguiente: tengo varias tablas (4 exactamente) que tienen columnas distintas pero hay 3 iguales que son las que me interesan, lo que quiero hacer es juntar esas 3 columnas de las 4 tablas en una misma tabla para ordenarlas por una columna, la fecha de publicación. Mi problema viene al intentar hacer los joins y la union ya que las junto pero se crean columnas iguales en vez de crear una columna y colocarse todo lo referente a esos datos dentro de ella.

He estado intentadolo con 2 tablas y 2 columnas y no he llegado a mucho la verdad, la sentencia que he usado es la siguiente:

Código :

SELECT mundotm_pistas.date, mundotm_pistas.name, mundotm_programas.date, mundotm_programas.name FROM mundotm_pistas LEFT OUTER JOIN mundotm_programas on mundotm_pistas.date = mundotm_programas.date

UNION

SELECT mundotm_pistas.date, mundotm_pistas.name, mundotm_programas.date, mundotm_programas.name FROM mundotm_pistas RIGHT OUTER JOIN  mundotm_programas on mundotm_pistas.date = mundotm_programas.date



Bueno, a ver si a alguien se le ocurre una solucion que mi cabeza no quiere darme la sentencia correcta....


Un saludo y gracias por adelantado

Por dvil88

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 May 2008 01:55 pm

Por DanielJimenez

70 de clabLevel



Genero:Masculino  

Web Developer

msie7
Citar            
MensajeEscrito el 24 May 2008 04:50 pm
En realidad no se entiend muy bien lo que quieres hacer con esa consulta.- Podrias dar un pequeño ejemplo.

Aca te pincele un poquito tu codigo:

Código :

SELECT pt.date, pt.name, pg.date, pg.name FROM mundotm_pistas pt LEFT  OUTER JOIN mundotm_programas pg using(date)
UNION
SELECT pt.date, pt.name, pg.date, pg.name FROM mundotm_pistas pt RIGHT OUTER JOIN mundotm_programas pg using(date)

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 24 May 2008 09:15 pm
Estas usando mal el union y el select. No necesitas usarlo y eso se puede hacer con los joins nada mas.

Algo así:

Código :

SELECT pt.date, pt.name
FROM mundotm_pistas pt 
INNER JOIN mundotm_programas pg 
ON pt.date = pg.date AND pt.name = pg.name


Con esto te unirá las tablas que tengan igual el date y el name y solo serán dos columnas, todas juntas. Es todo.

Aun así también tu diseño de la BD, creo que lo podrías mejorar, en mundotm_programas podrias crear una llave primaria MundotmPistarId y en las otras tablas usar esa llave foranea, así la unión sería mas elegante. Usar una llave compuesta de Nombre + Fecha, si bien es cierto que es válido, no es muy recomendado, sobretodo en una relación uno a uno.


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 25 May 2008 02:18 am
depende si quiere unir las tablas de forma horizontal o de forma vertical

ademas es muy diferente un Join a un Union

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 25 May 2008 09:36 am
Creo que no me explico bien jejeje, os comento lo que hay y lo que quiero hacer:

Tengo una pagina donde se suben distintas cosas (pistas, programas, tutoriales y diseños) y quiero mostrar las últimas 5 cosas subidas, que pueden ser de las 4 opciones, es decir, puede haber 2 pistas, 1 programa, 1 tutorial y 1 diseño por ejemplo y quiero conseguir eso con una consulta para no crear tablas y demás.


york3rs escribió:

En realidad no se entiend muy bien lo que quieres hacer con esa consulta.- Podrias dar un pequeño ejemplo.

Aca te pincele un poquito tu codigo:

Código :

SELECT pt.date, pt.name, pg.date, pg.name FROM mundotm_pistas pt LEFT  OUTER JOIN mundotm_programas pg using(date)
UNION
SELECT pt.date, pt.name, pg.date, pg.name FROM mundotm_pistas pt RIGHT OUTER JOIN mundotm_programas pg using(date)


Sale exactamente igual a como lo tenía


Dano escribió:

Estas usando mal el union y el select. No necesitas usarlo y eso se puede hacer con los joins nada mas.

Algo así:

Código :

SELECT pt.date, pt.name
FROM mundotm_pistas pt 
INNER JOIN mundotm_programas pg 
ON pt.date = pg.date AND pt.name = pg.name


Con esto te unirá las tablas que tengan igual el date y el name y solo serán dos columnas, todas juntas. Es todo.

Aun así también tu diseño de la BD, creo que lo podrías mejorar, en mundotm_programas podrias crear una llave primaria MundotmPistarId y en las otras tablas usar esa llave foranea, así la unión sería mas elegante. Usar una llave compuesta de Nombre + Fecha, si bien es cierto que es válido, no es muy recomendado, sobretodo en una relación uno a uno.


Saludos


No se selecciona nada....


DanielJimenez escribió:

talvez en este sitio encuentres algo:
http://dev.mysql.com/doc/refman/5.0/es/union.html

Saludos :cool:


Muchas gracias, al final me leí todo y se me iluminó la bombilla, no hace falta hacer joins, solo unas cuantas unions y estaría, os dejo la consulta mas o menos completa que he hecho por si alguno la necesita:

Código :

(SELECT id, name, date FROM mundotm_design)
UNION
(SELECT id, name, date FROM mundotm_pistas)
UNION
(SELECT id, name, date FROM mundotm_programas)
UNION
(SELECT id, name, date FROM mundotm_tutoriales)
ORDER BY date limit 5


muchas gracias a todos por la ayuda

Por dvil88

5 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.