Saltar al contenido

SELECCIONE * DE varias tablas. MySQL

Solución:

Lo que haces aquí se llama JOIN (aunque lo hace implícitamente porque selecciona entre varias tablas). Esto significa que, si no puso ninguna condición en su cláusula WHERE, tenía todas las combinaciones de esas tablas. Solo con su condición restringe su unión a aquellas filas donde coincide la identificación de la bebida.

Pero todavía hay X filas múltiples en el resultado para cada bebida, si hay X fotos con este drinks_id en particular. Tu declaración no restringe cuales foto (s) que quieres tener!

Si solo desea una fila por bebida, debe indicarle a SQL lo que desea hacer si hay varias filas con un drinks_id en particular. Para ello, necesita agrupación y una función agregada. Usted le dice a SQL qué entradas desea agrupar (por ejemplo, todas las bebidas_id iguales) y en SELECT, debe indicar cuál de las entradas distintas para cada fila de resultados agrupados debe tomarse. Para los números, esto puede ser promedio, mínimo, máximo (por nombrar algunos).

En su caso, no veo el sentido de consultar las fotos de bebidas si solo desea una fila. Probablemente pensaste que podías tener un variedad de fotos en su resultado para cada bebida, pero SQL no puede hacer esto. Si solo quieres alguna foto y no te importa cuál obtendrás, solo agrupa por el drinks_id (para obtener solo una fila por bebida):

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

En MySQL, también tenemos GROUP_CONCAT, si desea que los nombres de los archivos se concatenen en una sola cadena:

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

Sin embargo, esto puede volverse peligroso si tiene , dentro de los valores del campo, ya que lo más probable es que desee dividir esto nuevamente en el lado del cliente. Tampoco es una función agregada estándar de SQL.

Tendrá los valores duplicados para el nombre y el precio aquí. Y los identificadores están duplicados en la tabla drinks_photos. No hay forma de evitarlos. ¿También qué es exactamente lo que quieres el resultado?

Para deshacerse de los duplicados, puede agrupar por drinks.id. Pero de esa manera solo obtendrás una foto para cada drinks.id (la foto que obtendrá depende de la implementación interna de la base de datos).

Aunque no está documentado, en el caso de MySQL, obtendrá la foto con el menor id (en mi experiencia nunca he visto otro comportamiento).

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id
GROUP BY drinks.id
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *