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

[SOLUCIONADO] consulta SQL para obtener varios datos en una única celda

Estas en el tema de consulta SQL para obtener varios datos en una única celda en el foro de Mysql en Foros del Web. Hola. Tengo una base de datos con las siguientes tablas y columnas: authors: author_id, name, surname songs: song_id, author_id, song_title, lyric albums: album_id, album_title, year ...
  #1 (permalink)  
Antiguo 08/09/2015, 02:47
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 8 años, 8 meses
Puntos: 1
consulta SQL para obtener varios datos en una única celda

Hola.

Tengo una base de datos con las siguientes tablas y columnas:

authors: author_id, name, surname
songs: song_id, author_id, song_title, lyric
albums: album_id, album_title, year
songs_albums: song_id, album_id

Es decir:

a) las tablas authors y songs mantienen una relación uno a varios (un mismo autor puede tener varias canciones, pero -en mi caso- una canción no puede estar escrita por más de un autor).

b) las tablas songs y albums mantienen una relación varios a varios a través de la tabla songs_albums (una misma canción puede estar en más de un album y un mismo album puede contener más de una canción).

Dicho esto, no soy capaz de hacer una consulta SQL para obtener sobre un único autor todas sus canciones (en la primera columna) y, además, el disco (o los discos) en donde está publicada cada canción (en la segunda columna). Es decir, mi objetivo es obtener una tabla con las filas siguientes para el autor X:

Canción Disco
canción1 disco 1
canción2 disco 1
canción3 disco 1, disco 2
canción4 disco 3
...

Es posible una consulta de ese tipo con el diseño actual de mi base de datos?
  #2 (permalink)  
Antiguo 09/09/2015, 07:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: consulta SQL para obtener varios datos en una única celda

Hola gaelv80:

Lo que quieres, si se puede obtener, puedes utilizar por ejemplo la función GROUP_CONCAT para poner todos los discos en los que aparece una canción en una columna con valores separados por comas, es decir, algo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +-----------+---------+
  3. | cancion   | disco   |
  4. +-----------+---------+
  5. | cancion 1 | disco 1 |
  6. | cancion 1 | disco 2 |
  7. | cancion 2 | disco 1 |
  8. | cancion 2 | disco 2 |
  9. | cancion 2 | disco 3 |
  10. | cancion 3 | disco 2 |
  11. +-----------+---------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT cancion, GROUP_CONCAT(disco) discos
  15.     -> FROM tabla
  16.     -> GROUP BY cancion;
  17. +-----------+-------------------------+
  18. | cancion   | discos                  |
  19. +-----------+-------------------------+
  20. | cancion 1 | disco 1,disco 2         |
  21. | cancion 2 | disco 1,disco 2,disco 3 |
  22. | cancion 3 | disco 2                 |
  23. +-----------+-------------------------+
  24. 3 rows in set (0.00 sec)

El resto es sólo armar correctamente los JOIN's que necesites para poder filtrar por un autor en específico.

haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 10/09/2015, 07:25
 
Fecha de Ingreso: agosto-2015
Mensajes: 21
Antigüedad: 8 años, 8 meses
Puntos: 1
Respuesta: consulta SQL para obtener varios datos en una única celda

Gracias por tu respuesta.

Al final conseguí lo que buscaba usando la función GROUP_CONCAT junto con la función GROUP BY para no tener títulos de canciones repetidos en distintas filas. Además, usé la función SEPARATOR para definir un separador personalizado entre los diferentes discos. Adjunto a continuación la query por si a alguien más le sirve de ayuda:

Código MySQL:
Ver original
  1. SELECT songs.song_title, GROUP_CONCAT(albums.album_title ORDER BY albums.album_title SEPARATOR ' / ') AS group_album FROM songs INNER JOIN songs_albums ON (songs.song_id = songs_albums.song_id) INNER JOIN albums ON (songs_albums.album_id = albums.album_id) WHERE author_id = '01' GROUP BY song_title"

Etiquetas: celda, sql, tabla
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 01:04.