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

Datos de dos tablas que no tienen nada entre sí

Estas en el tema de Datos de dos tablas que no tienen nada entre sí en el foro de Mysql en Foros del Web. Hola he leído muchos post sobre UNION, JOIN, JOIN LEFT, etc... Pero no lo consigo. Me explico: Tengo 2 tablas: "canciones" y "fotos". Recogo por ...
  #1 (permalink)  
Antiguo 25/05/2012, 10:07
 
Fecha de Ingreso: octubre-2011
Mensajes: 34
Antigüedad: 10 años, 9 meses
Puntos: 2
Datos de dos tablas que no tienen nada entre sí

Hola he leído muchos post sobre UNION, JOIN, JOIN LEFT, etc... Pero no lo consigo. Me explico:

Tengo 2 tablas:

"canciones" y "fotos".

Recogo por método GET una búsqueda que puede contener el título de una canción o bien de una foto.

Quiero mostrar en pantalla ambos resultados.

Hasta ahora mi consulta era así:



$query= "SELECT * FROM canciones WHERE titulo LIKE '$titulo_buscado' AND mp3 LIKE 'disponible' LIMIT 20";

$result= mysql_query($query);

while($row = mysql_fetch_array($result))
{
$titulo= $row['titulo'];

echo $titulo;
echo "<br><br>";
}





Pero quiero que también muestre los títulos de la tabla fotos.

Ambas tablas como veis no tienen nada entre sí, la única condición es que coincidan con $titulo_buscado y luego otras que le pongo yo como la de mp3 LIKE disponible.


¿Alguien sabe?
  #2 (permalink)  
Antiguo 25/05/2012, 14:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años, 6 meses
Puntos: 447
Respuesta: Datos de dos tablas que no tienen nada entre sí

Hola jinno2323:

Vamos por partes... creo que resulta obvio que tratar de juntar las dos tablas puede resultar tan complicado como hacer que un perro y un gato se lleven bien . la opción de los JOIN's de entrada creo quedaría descartada, pues para para estos es necesario que tengan algún campo común, pero en este caso el titulo no sirve para este propósito. La opción que queda entonces sería utilizar un UNION pero recordando que para poder hacer la unión el número de campos y su tipo debe ser el mismo en cada una de las partes de la unión. En tu post no nos dices cual es la estructura de tus tablas, pero checa este ejemplo, creo que te puede aclarar el panorama. supongamos que tenemos estos datos (la estructura es hipotética, pues en tu post no pones cuál es la estructura de tus tablas ni datos de ejemplo);

Código MySQL:
Ver original
  1. mysql> SELECT * FROM canciones;
  2. +------------+---------------------+-------------------+---------+
  3. | id_cancion | titulo              | interprete        | formato |
  4. +------------+---------------------+-------------------+---------+
  5. |          1 | Mujeres Divinas     | Vicente Fernandez | mp3     |
  6. |          2 | Esclavo y Amo       | Javier Solis      | mp3     |
  7. |          3 | Por Mujeres como Tu | Pepe Aguilar      | wma     |
  8. |          4 | El aventurero       | Pedro Infante     | wma     |
  9. +------------+---------------------+-------------------+---------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM fotos;
  13. +---------+---------------------+----------------+-------------+---------+
  14. | id_foto | titulo_foto         | fotografo      | tipo        | formato |
  15. +---------+---------------------+----------------+-------------+---------+
  16. |       1 | Mujeres protestando | Robert Capa    | Noticia     |      35 |
  17. |       2 | Mi Ciudad           | Henri Cartier  | Paisaje     |      24 |
  18. |       3 | Mi perro            | Elliott Erwitt | Instantanea |      12 |
  19. |       4 | Marido y Mujer      | Werner Bischof | Sociales    |      35 |
  20. +---------+---------------------+----------------+-------------+---------+
  21. 4 rows in set (0.00 sec)

De entrada vemos que las estructuras y los campos son diferentes por lo tanto hacer un select * queda descartado. Según lo que dices te interesa sólo el campo titulo... por lo tanto podría hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT 'cancion' tabla, titulo
  2.     -> FROM canciones
  3.     -> WHERE titulo LIKE '%Mujer%' AND formato = 'mp3'
  4.     -> UNION
  5.     -> SELECT 'foto' tabla, titulo_foto
  6.     -> FROM fotos
  7.     -> WHERE titulo_foto LIKE '%Mujer%';
  8. +---------+---------------------+
  9. | tabla   | titulo              |
  10. +---------+---------------------+
  11. | cancion | Mujeres Divinas     |
  12. | foto    | Mujeres protestando |
  13. | foto    | Marido y Mujer      |
  14. +---------+---------------------+
  15. 3 rows in set (0.00 sec)

Observa que los dos select's tienen el mismo numero de campos y son del mismo tipo (una constante y el título respectivo). Cada SELECT se comporta de manera independiente, por lo tanto puedes filtrar la información de cada una de las tablas según lo que prefieras.

Espero que esto te pueda servir. Sigue leyendo acerca de las UNIONES para encontrar otros ejemplos que te puedan servir. Finalmente, dos observaciones: primero, cuando utilices comparaciones con LIKE utiliza carecteres comodín (%) o en su defecto condiciones (=).

Código:
No hagas esto: 
formato like 'mp3'

Utiliza cualquiera de estas comparaciones:
formato like '%mp3%'       o       formato = 'mp3'
Segundo, cuando publiques alguna pregunta en este foro NO INCLUYAS LINEAS DE CÓDIGO DE OTROS LENGUAJES, solo código SQL y cualquier código sobre MySQL.

Saludos
Leo.
  #3 (permalink)  
Antiguo 26/05/2012, 05:03
 
Fecha de Ingreso: octubre-2011
Mensajes: 34
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Datos de dos tablas que no tienen nada entre sí

Gracias por responder pero lamentablemente no lo entiendo y me quedan muchas dudas.

Disculpa por poner código de PHP, lo puse por si había que extraer los datos de alguna otra manera para luego poder mostrarlos.

Haber, mis campos podrían ser igual que los tuyos que has puesto en este ejemplo, sólo que con otros nombres y otros contenidos, pero eso es lo de menos, lo importante es entenderlo en mi caso. Y no lo entiendo porque, con las tablas que tu me has puesto:

Código:
 mysql> SELECT * FROM canciones;
+------------+---------------------+-------------------+---------+
| id_cancion | titulo              | interprete        | formato |
+------------+---------------------+-------------------+---------+
|          1 | Mujeres Divinas     | Vicente Fernandez | mp3     |
|          2 | Esclavo y Amo       | Javier Solis      | mp3     |
|          3 | Por Mujeres como Tu | Pepe Aguilar      | wma     |
|          4 | El aventurero       | Pedro Infante     | wma     |
+------------+---------------------+-------------------+---------+
4 rows IN SET (0.00 sec)
 
mysql> SELECT * FROM fotos;
+---------+---------------------+----------------+-------------+---------+
| id_foto | titulo_foto         | fotografo      | tipo        | formato |
+---------+---------------------+----------------+-------------+---------+
|       1 | Mujeres protestando | Robert Capa    | Noticia     |      35 |
|       2 | Mi Ciudad           | Henri Cartier  | Paisaje     |      24 |
|       3 | Mi perro            | Elliott Erwitt | Instantanea |      12 |
|       4 | Marido y Mujer      | Werner Bischof | Sociales    |      35 |
+---------+---------------------+----------------+-------------+---------+
4 rows IN SET (0.00 sec)
y la consulta de ejemplo con UNION que me has mostrado, no coinciden los campos del ejemplo con los de la búsqueda:


Código:
mysql> SELECT 'cancion' tabla, titulo
    -> FROM canciones
    -> WHERE titulo LIKE '%Mujer%' AND formato = 'mp3'
    -> UNION
    -> SELECT 'foto' tabla, titulo_foto
    -> FROM fotos
    -> WHERE titulo_foto LIKE '%Mujer%';
Es decir, en tu consulta:

SELECT 'cancion' ese campo no lo veo arriba en el ejemplo, y lo mismo te digo con tabla, titulo.

Lo que sí que se es que para hacer un ORDER BY tengo que ponerlos entre paréntesis cada SELECT, pero tu consulta no llego a entenderla.

Otras dudas que me quedan están relacionadas con los UNION:
-Para poder hacer un UNION es necesario que como has dicho tú:

Cita:
¿Tenga que tener el mismo número de campos y su tipo (¿columna te refieres?) debe ser el mismo?
Porque de ser necesario así, en mi tabla no los tengo ni con el mismo nombre (de columna) ni con el mismo número de campos, porque como te dije, es igual que la tuya en "términos generales".

-La otra duda es que si los campos son diferentes, es decir, si en la tabla de canciones los títulos se guardan en la columbra "nombre_cancion" y en la tabla de fotos los títulos se guardan en la columna "nombre_foto", como puedo mostrarlos luego en pantalla. (Tal vez ésto sea de PHP y no me MySQL, es que no lo sé).

Te agradecería que me lo explicaras mostrándome una consulta pero con la tabla de ejemplo que me has puesto, si es que se puede, cosa que imagino que sí.

Muchas gracias y disculpa mi ignorancia en esto de los UNION, no tengo tanta experiencia en MySQL.
  #4 (permalink)  
Antiguo 26/05/2012, 05:29
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 10 años, 2 meses
Puntos: 97
Respuesta: Datos de dos tablas que no tienen nada entre sí

Gracias por tu explicación sobre union. Muy buena!

Cita:
SELECT 'cancion'
no es un campo, es un string para que sepas de que tabla proviene, y 'tabla', es un alias, un nombre con que identificar la columna.

Tienes que igualar el numero de campos de las 2 tablas y, evidentemente, que sean del mismo tipo

select fecha,.... en una y select nombre_foto....en otra, no serviria.
  #5 (permalink)  
Antiguo 26/05/2012, 13:57
Avatar de fahs82  
Fecha de Ingreso: abril-2012
Ubicación: guadalajara
Mensajes: 139
Antigüedad: 10 años, 2 meses
Puntos: 12
Respuesta: Datos de dos tablas que no tienen nada entre sí

consultas anidadas , alias y union es lo que debes de analizar , estructura tu query , declara los alias y factoriza en consultas anidadas , supongo que eso debe funcionar pero echale un poco de coco tu mismo para solucionarlo y que comprendas bien lo que estas haciendo a futuro esto te evitara muchos problemas o te ayudara a solucionar lso que se te planteen por tu propia cuenta
  #6 (permalink)  
Antiguo 28/05/2012, 08:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años, 6 meses
Puntos: 447
Respuesta: Datos de dos tablas que no tienen nada entre sí

Hola de nuevo jinno2323:

A ver, tratemos de resolver las dudas que tienes:

PRIMERO:

Cita:
y la consulta de ejemplo con UNION que me has mostrado, no coinciden los campos del ejemplo con los de la búsqueda:
Tal como te comenté en el primer post, cuando utilizas una consulta UNION es importante que el NUMERO de campos en los selects sea el mismo, es decir, no puede hacer algo como esto:

Código:
SELECT campo FROM tabla1
union
SELECT campo, campo2 FROM tabla2
Observa detenidamente la estructura de las tablas que pongo de ejemplo... NO TIENEN EL MISMO NUMERO DE CAMPO, por lo tanto hacer un select * queda descartado, pues las consultas no tendrían el mismo numero de campos.

Ahora observa la consulta resultante:

Código:
SELECT 'cancion' tabla, titulo
......
SELECT 'foto' tabla, titulo_foto
......
Observa que en ambas consultas SE ESTÁN REGRESANDO DOS CAMPOS, el primero que sería una CONSTANTE y ya oscartt67 comenta acertadamente:

Código:
es un string para que sepas de que tabla proviene, 
y 'tabla', es un alias, un nombre con que identificar la columna
.
SEGUNDO:

Cita:
para hacer un ORDER BY tengo que ponerlos entre paréntesis cada SELECT
Ojo con el ORDER BY... este varía su comportamiento de acuerdo a cómo lo colocas... puedes ponerlo en cada subconsulta:

Código:
(SELECT .....
ORDER BY campo)
UNION
(SELECT .....
ORDER BY campo)
Colocado de esta forma ORDENA CADA SUBCONSULTA de manera independiente y después realiza la unión... Sin embargo también puedes poner un ORDER BY GENERAL:

Código:
SELECT .....
UNION
SELECT .....
ORDER BY campo
En este caso, al no poner paréntesis PRIMERO SE REALIZA LA UNIÓN y después se realiza la ordenación del resultado de la unión. Aquí depende de cómo quieras mostrar tu información.

TERCERO:

Cita:
¿Tenga que tener el mismo número de campos y su tipo (¿columna te refieres?) debe ser el mismo?
Es recomendable que verifiques que los campos tengan el mismo tipo o un tipo compatible, ya que de lo contrario puede ocasionar errores:

Código:
Select CampoA_Date, CampoA_Varchar, CampoA_Otro...
UNION
Select CampoB_Date, CampoB_Varchar, CampoB_Otro...
Observa que la correspondencia de los tipos de columna debe ser la misma (CampoA_Date = CampoB_date). MySQL realiza algunas conversiones implícitas, pero es recomendable siempre verificar los tipos de manera manual:

CUARTO:

Cita:
si los campos son diferentes, es decir, si en la tabla de canciones los títulos se guardan en la columbra "nombre_cancion" y en la tabla de fotos los títulos se guardan en la columna "nombre_foto", como puedo mostrarlos luego en pantalla.
No importa si tienen un nombre diferente, LO IMPORTANTE ES EL TIPO. Por defecto se asigna como alias EL NOMBRE DE CAMPO DE LA PRIMER TABLA... de hecho, si observas en el ejemplo yo estoy realizando la unión entre dos campos QUE NO TIENEN EL MISMO NOMBRE:


Código:
SELECT 'cancion' tabla, titulo
...
UNION
SELECT 'foto' tabla, titulo_foto
...
Observa también que en el resultado de salida se asigna como nombre de columna el de la primer tabla:

Código:
+---------+---------------------+
| tabla   | titulo              |
+---------+---------------------+
Pero si no quieres esto, PUEDES ASIGNARLE EL ALIAS QUE TU QUIERAS para dejar la misma descripción en las dos consultas_

Código:
SELECT 'cancion' tabla,  titulo esto_es_un_alias
...
UNION
SELECT 'foto' tabla, titulo_foto esto_es_un_alias
...
Espero que con esto te quede un poco más claro el panorama y si como dices, eres novato pues no te queda otra más que leer y seguir investigando.

Saludos
Leo.
  #7 (permalink)  
Antiguo 28/05/2012, 14:51
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 10 años, 1 mes
Puntos: 5
Respuesta: Datos de dos tablas que no tienen nada entre sí

Hola jinno2323,

A veces nos empeñamos en hacerlo díficil y nadie nos saca de lo nuestro. Creo que lo que pides sería algo tan sencillo como:

Código SQL:
Ver original
  1. SELECT * FROM tabla1,tabla2

Si sólo quieres mostrar unos campos de cada una de las tablas utiliza la sintaxis de punto: tabla.columna

¡Un saludo!
  #8 (permalink)  
Antiguo 28/05/2012, 15:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años, 7 meses
Puntos: 2658
Respuesta: Datos de dos tablas que no tienen nada entre sí

Davikt: Eso es un JOIN y lo que el pregunta se resuelve con UNION, como dice Leo.
No es TAN sencillo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/05/2012, 15:07
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años, 6 meses
Puntos: 447
Respuesta: Datos de dos tablas que no tienen nada entre sí

Hola davikt:

La consulta que propones es una de las primeras que debes evitar a toda costa, ya que generas un producto cartesiano entre tus tablas... supongamos que tienes 1,000 registros en cada una de las tablas... con una UNION, aun sin filtrar información, el resultado sería una tabla con 2,000 registros. con la consulta que propones, el resultado sería

Código:
1,000 * 1,000 = 1,000,000 de registros
Se entiende por que hay que evitar los productos cartesianos???

Pero bueno, quien debe decir si le sirve la consulta o no sería el autor de la pregunta, así es que esperemos los comentarios de jinno2323.

Saludos
Leo.
  #10 (permalink)  
Antiguo 30/05/2012, 09:25
 
Fecha de Ingreso: octubre-2011
Mensajes: 34
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Datos de dos tablas que no tienen nada entre sí

Ok, me ha quedado todo mucho más claro.

También es cierto que "no podía jugar bien al juego" sino me sabía las reglas. Como lo del mismo número de campos seleccionados y por supuesto el tipo.

Aún así, sigo revisando de vez en cuando algunos otros post de MySQL porque hay cosas más avanzadas que no las sé o sencillamente "se me van".

Ahora me queda evitar que no se muestren campos repetidos con el mismo nombre.

*¿Una última pregunta, cómo lo podría ordenar por tabla? He descubierto que escribiendo primero el select que quiero lo puedo ordenar, ¿es ésta una forma correcta o existe otra mejor?

Muchas gracias a todos, especialmente a Leo.

Última edición por jinno2323; 30/05/2012 a las 10:47

Etiquetas: join, nada, select, sql, tabla, tablas
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




La zona horaria es GMT -6. Ahora son las 05:42.