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

Relación de dos tablas con un solo registro de la segunda tabla

Estas en el tema de Relación de dos tablas con un solo registro de la segunda tabla en el foro de Mysql en Foros del Web. Buenas amigos del foro espero que puedan ayudarme con un problema que tengo: Tengo dos tablas una con las columnas: -id_album -nombre -categoria ------------- -id_fotografia ...
  #1 (permalink)  
Antiguo 06/03/2012, 15:08
 
Fecha de Ingreso: febrero-2010
Mensajes: 60
Antigüedad: 14 años, 1 mes
Puntos: 0
Relación de dos tablas con un solo registro de la segunda tabla

Buenas amigos del foro espero que puedan ayudarme con un problema que tengo:
Tengo dos tablas una con las columnas:
-id_album
-nombre
-categoria

-------------
-id_fotografia
-url_fotografia
-id_album

Lo que quiero es consultar todos los albums disponibles (tabla 1), pero que me devuelva con un solo registro de la tabla 2.

Intente con:

SELECT *
FROM albums LEFT JOIN fotografias USING (id_album)
WHERE albums.categoria = 'paisajes'

Suponiendo que el album con id 35 tiene 25 fotografias en la consulta me devuelve las 25; quisiera que solo me devuelva una que puede ser aleatorio o la ultima pero solo una.

Osea todos los albums con solo una fotografía.

Espero que me puedan ayudar y gracias.
  #2 (permalink)  
Antiguo 06/03/2012, 16:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Relación de dos tablas con un solo registro de la segunda tabla

Hola clarkpler:

En este otro post estamos discutiendo justamente alternativas semejantes a lo que estás pidiendo:

http://www.forosdelweb.com/f86/probl...gistro-979826/

En tu caso podrías hacerlo más o menos así (usando joins)
Código MySQL:
Ver original
  1. mysql>
  2. mysql> SELECT * FROM tabla1;
  3. +----------+---------+-----------+
  4. | id_album | nombre  | categoria |
  5. +----------+---------+-----------+
  6. |        1 | album 1 | familia   |
  7. |        2 | album 2 | amigos    |
  8. |        3 | album 3 | autos     |
  9. |        4 | vacio   | otro      |
  10. +----------+---------+-----------+
  11. 4 rows in set (0.00 sec)
  12.  
  13.  SELECT * FROM tabla2;
  14. +---------------+----------------+----------+
  15. | id_fotografia | url_fotografia | id_album |
  16. +---------------+----------------+----------+
  17. |             1 | papa.jpg       |        1 |
  18. |             2 | mama.jpg       |        1 |
  19. |             3 | hermano.jp     |        1 |
  20. |             4 | victor.jpg     |        2 |
  21. |             5 | ßngel.jpg      |        2 |
  22. |             6 | mustang.jp     |        3 |
  23. |             7 | vocho.jpg      |        3 |
  24. +---------------+----------------+----------+
  25. 7 rows in set (0.00 sec)
  26.  
  27. mysql> SELECT T1.*, T3.*
  28.     -> FROM tabla1 T1
  29.     -> LEFT JOIN
  30.     -> (SELECT MIN(id_fotografia) min_id, id_album
  31.     -> FROM tabla2 GROUP BY id_album) T2 ON T1.id_album = T2.id_album
  32.     -> LEFT JOIN tabla2 T3
  33.     -> ON T3.id_fotografia = T2.min_id AND T3.id_album = T2.id_album;
  34. +----------+---------+-----------+---------------+----------------+----------+
  35. | id_album | nombre  | categoria | id_fotografia | url_fotografia | id_album |
  36. +----------+---------+-----------+---------------+----------------+----------+
  37. |        1 | album 1 | familia   |             1 | papa.jpg       |        1 |
  38. |        2 | album 2 | amigos    |             4 | victor.jpg     |        2 |
  39. |        3 | album 3 | autos     |             6 | mustang.jp     |        3 |
  40. |        4 | vacio   | otro      |          NULL | NULL           |     NULL |
  41. +----------+---------+-----------+---------------+----------------+----------+
  42. 4 rows in set (0.00 sec)

Con esto estarías obteniendo la primer (min id) foto asignada para cada álbum.

Dale un vistazo también al otro post. ahí wchiquito muestra otra alternativa que también podrías tratar de implementar.

Saludos
Leo.
  #3 (permalink)  
Antiguo 06/03/2012, 21:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 60
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Relación de dos tablas con un solo registro de la segunda tabla

Muchas gracias amigo, me salvaste de una, me sirvió a la perfección, pero si me pudieras explicar un poco en que consiste el código sería perfecto. T1 T2 y T3 son asignaciones?
  #4 (permalink)  
Antiguo 07/03/2012, 09:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Relación de dos tablas con un solo registro de la segunda tabla

Hola clarkpler:

Con gusto trataré de explicar la consulta, para que se entienda mejor. T1, T2, y T3 son alias:
Código:
tabla1 T1
(SELECT MIN(id_fotografia) min_id, id_album FROM tabla2 GROUP BY id_album) T2 
tabla2 T3 
Si observas, tanto en la subconsulta como en el último JOIN hago referencia a la misma tabla2. La idea de la sobconsulta es obtener el mínimo ID para cada album:

Código MySQL:
Ver original
  1. mysql> SELECT MIN(id_fotografia) min_id, id_album
  2.     -> FROM tabla2 GROUP BY id_album;
  3.  
  4. +--------+----------+
  5. | min_id | id_album |
  6. +--------+----------+
  7. |      1 |        1 |
  8. |      4 |        2 |
  9. |      6 |        3 |
  10. +--------+----------+
  11. 3 rows in set (0.00 sec)

Esta tabla te sirve para filtrar justamente los resultados, observa en el siguiente ejemplo, que si no utilizo esta subconsulta para filtrar la información, el resultado es el mismo que se obtiene con la consulta que tú intentaste:

Código MySQL:
Ver original
  1. mysql> SELECT T1.*, T3.*
  2.     -> FROM tabla1 T1
  3.     -> LEFT JOIN tabla2 T3
  4.     -> ON T3.id_album = T1.id_album;
  5. +----------+---------+-----------+---------------+----------------+----------+
  6. | id_album | nombre  | categoria | id_fotografia | url_fotografia | id_album |
  7. +----------+---------+-----------+---------------+----------------+----------+
  8. |        1 | album 1 | familia   |             1 | papa.jpg       |        1 |
  9. |        1 | album 1 | familia   |             2 | mama.jpg       |        1 |
  10. |        1 | album 1 | familia   |             3 | hermano.jp     |        1 |
  11. |        2 | album 2 | amigos    |             4 | victor.jpg     |        2 |
  12. |        2 | album 2 | amigos    |             5 | ßngel.jpg      |        2 |
  13. |        3 | album 3 | autos     |             6 | mustang.jp     |        3 |
  14. |        3 | album 3 | autos     |             7 | vocho.jpg      |        3 |
  15. |        4 | vacio   | otro      |          NULL | NULL           |     NULL |
  16. +----------+---------+-----------+---------------+----------------+----------+
  17. 8 rows in set (0.00 sec)
  18.  
  19. mysql> SELECT * FROM tabla1 LEFT JOIN tabla2 USING (id_album);
  20. +----------+---------+-----------+---------------+----------------+
  21. | id_album | nombre  | categoria | id_fotografia | url_fotografia |
  22. +----------+---------+-----------+---------------+----------------+
  23. |        1 | album 1 | familia   |             1 | papa.jpg       |
  24. |        1 | album 1 | familia   |             2 | mama.jpg       |
  25. |        1 | album 1 | familia   |             3 | hermano.jp     |
  26. |        2 | album 2 | amigos    |             4 | victor.jpg     |
  27. |        2 | album 2 | amigos    |             5 | ßngel.jpg      |
  28. |        3 | album 3 | autos     |             6 | mustang.jp     |
  29. |        3 | album 3 | autos     |             7 | vocho.jpg      |
  30. |        4 | vacio   | otro      |          NULL | NULL           |
  31. +----------+---------+-----------+---------------+----------------+
  32. 8 rows in set (0.00 sec)

Si tienes alguna otra duda con gusto tratamos de ayudarte.

Saludos
Leo.
  #5 (permalink)  
Antiguo 07/03/2012, 12:46
 
Fecha de Ingreso: febrero-2010
Mensajes: 60
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Relación de dos tablas con un solo registro de la segunda tabla

Muchas gracias por la explicación.

Etiquetas: join, registro, segunda, select, 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 08:39.