Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Simplificar varias consultas dentro de while

Estas en el tema de Simplificar varias consultas dentro de while en el foro de PHP en Foros del Web. Buenas a todos, tengo una duda con mysql y las relaciones muchos a muchos: Tengo tres tablas tal que asi: autor a a.ID_AUTOR a.NOMBRE cancion ...
  #1 (permalink)  
Antiguo 04/01/2016, 04:55
 
Fecha de Ingreso: enero-2016
Mensajes: 2
Antigüedad: 8 años, 3 meses
Puntos: 0
Pregunta Simplificar varias consultas dentro de while

Buenas a todos, tengo una duda con mysql y las relaciones muchos a muchos:

Tengo tres tablas tal que asi:

autor a
a.ID_AUTOR
a.NOMBRE

cancion m
m.ID_CANCION
m.TITULO

cancion_autor ma
ma.ID_MA
ma.ID_CANCION
ma.ID_AUTOR

Para mostrar el listado de todas las canciones y que apareciesen todos los autores de dichas canciones usaba una búsqueda de todas las canciones:

Código:
SELECT m.TITULO, m.ID_CANCION FROM cancion m
y en el while para mostrar los datos de cada canción (guardado su id en $ID_CANCION) anidaba otra consulta para conseguir los autores de dicha canción:

Código:
SELECT ma.ID_MA, a.NOMBRE, FROM cancion_autor ma
INNER JOIN autor a ON a.ID_AUTOR = ma.ID_AUTOR
WHERE ma.ID_CANCION LIKE '$ID_CANCION'
El problema es que si son casi 4000 canciones -con sus casi 4000 while y sus casi 4000 consultas- y la cantidad de consultas que hay que hacer a la base de datos me parece excesivo.

Por desgracia mis conocimientos de mysql no llegan como para conseguir todos los datos que necesito en una sola búsqueda, eliminando la consulta dentro del bucle while. Es decir: querría conseguir que al buscar en todas las canciones, en el array de resultados me apareciesen los nombres de todos los autores de dicha canción.

Espero que se me haya entendido. Muchas gracias de antemano, saludos.
  #2 (permalink)  
Antiguo 04/01/2016, 05:09
 
Fecha de Ingreso: julio-2015
Ubicación: Tenerife
Mensajes: 10
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Simplificar varias consultas dentro de while

¿Realmente que quieres? que en una tabla se muestre la canción, autor etc...?
  #3 (permalink)  
Antiguo 04/01/2016, 05:23
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 3 meses
Puntos: 10
Respuesta: Simplificar varias consultas dentro de while

No he entendido demasiado bien lo que pretendes hacer ¿Quieres mostrar un listado de canciones con toda su información?

¿Si es así, porque no utilizas un solo while con una consulta JOIN que te saque directamente toda la info (id cancion, Titulo cancion, id autor, nombre autor, etc)?

Código MySQL:
Ver original
  1. SELECT a.ID_AUTOR, a.NOMBRE, m.ID_CANCION, m.TITULO FROM ((cancion_autor JOIN cancion ON ma.ID_CANCION = cancion.m.ID_CANCION) JOIN autor ON ma.ID_AUTOR = autor.a.ID_AUTOR);
  #4 (permalink)  
Antiguo 04/01/2016, 05:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Simplificar varias consultas dentro de while

Tu problema no es con PHP, sino con MySQL.
Deberías haber potesdo la pregunta en el foro de MySQL..

Por empezar, no entiendo para qué recorrer canción por canción, para obtener sus ID, si lo que luego haces es consultar por los autores de las mismas.
¿Por qué no haces un único JOIN y obtienes todo?
SUponiendo que pueda haber más de un autor por cancion, pero los quieras todos agrupados:
Código MySQL:
Ver original
  1. SELECT  c.TITULO, GROUP_CONCAT(a.NOMBRE) Autores,
  2. FROM cancion c
  3.     INNER JOIN cancion_autor ma on c.idcancion = ma.idcancion
  4.     INNER JOIN autor a ON a.ID_AUTOR = ma.ID_AUTOR
  5. GROUP BY c.idcancion
  6. ORDER BY c.TITULO

Si quieres la lista autor por autor:
Código MySQL:
Ver original
  1. SELECT  c.TITULO, a.NOMBRE  Autores,
  2. FROM cancion c
  3.     INNER JOIN cancion_autor ma on c.idcancion = ma.idcancion
  4.     INNER JOIN autor a ON a.ID_AUTOR = ma.ID_AUTOR
  5. ORDER BY1, 2
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/01/2016, 05:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Simplificar varias consultas dentro de while

Cita:
Iniciado por Zenok Ver Mensaje
No he entendido demasiado bien lo que pretendes hacer ¿Quieres mostrar un listado de canciones con toda su información?

¿Si es así, porque no utilizas un solo while con una consulta JOIN que te saque directamente toda la info (id cancion, Titulo cancion, id autor, nombre autor, etc)?

Código MySQL:
Ver original
  1. SELECT a.ID_AUTOR, a.NOMBRE, m.ID_CANCION, m.TITULO FROM ((cancion_autor JOIN cancion ON ma.ID_CANCION = cancion.m.ID_CANCION) JOIN autor ON ma.ID_AUTOR = autor.a.ID_AUTOR);
@Zenok:

Ten cuidado con el uso de paréntesis en MySQL. No solo son innecesarios para el JOIN, sino que pueden hacer que se generen consultas ineficientes.
El parser en ciertos casos los usa para establecer el orden de los JOIN, lo qu epuede disparar consultas ineficientes de acuerdo a los datos que existan en el momento.
Si pones los JOIN sin paréntesis, estás permitiendo que el parser busque cual es la mejor posibilidad.

No te olvides que MySQL no es SQL Server. No tiene las mismas reglas de inferencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 04/01/2016, 05:35
 
Fecha de Ingreso: enero-2016
Mensajes: 2
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Simplificar varias consultas dentro de while

¡Fantástico! Muchísimas gracias por vuestra ayuda.

Siento no haber puesto el tema en mysql, ando un poco perdido con la estructura de los foros

¡Tema resuelto!
  #7 (permalink)  
Antiguo 04/01/2016, 05:41
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 3 meses
Puntos: 10
Respuesta: Simplificar varias consultas dentro de while

Cita:
Iniciado por gnzsoloyo Ver Mensaje
@Zenok:

Ten cuidado con el uso de paréntesis en MySQL. No solo son innecesarios para el JOIN, sino que pueden hacer que se generen consultas ineficientes.
El parser en ciertos casos los usa para establecer el orden de los JOIN, lo qu epuede disparar consultas ineficientes de acuerdo a los datos que existan en el momento.
Si pones los JOIN sin paréntesis, estás permitiendo que el parser busque cual es la mejor posibilidad.

No te olvides que MySQL no es SQL Server. No tiene las mismas reglas de inferencia.
Muchas gracias por tu advertencia, no sabía que los paréntesis afectaban a la eficiencia de la consulta.
  #8 (permalink)  
Antiguo 04/01/2016, 05:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Simplificar varias consultas dentro de while

Yo no lo sabía cuando empecé a usarlo con una base bastante poblada de datos (millones de registros), por lo que estuve usando el EXPLAIN para analizar lo que pasaba y me encontré con eso. De acuerdo al orden de los paréntesis que ponía, la cantidad de registros que se leían, y las claves propuestas variaban.
En su momento fue una sorpresa.
Es útil para forzar ciertas soluciones, pero no como una regla de uso general.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: mysql, select, simplificar, 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 10:33.