sql >> Base de Datos >  >> RDS >> Mysql

SELECCIONE * DE varias tablas. mysql

Lo que hace aquí se llama JOIN (aunque lo hace implícitamente porque selecciona de varias tablas). Esto significa que, si no puso ninguna condición en su cláusula WHERE, tenía todas las combinaciones de esas mesas. 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 id de bebida en particular. Su declaración no restringe cuál foto(s) que quieres tener!

Si solo desea una fila por bebida, debe decirle a SQL lo que desea hacer si hay varias filas con una bebida_id en particular. Para esto necesita agrupar y una función agregada . Usted le dice a SQL qué entradas desea agrupar (por ejemplo, todas las bebidas iguales) y en SELECCIONAR, debe indicar cuál de las distintas entradas para cada fila de resultados agrupados debe tomarse. Para 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 pensó que podría tener una matriz de fotos en su resultado para cada bebida, pero SQL no puede hacer esto. Si solo quieres cualquiera foto y no le importa cuál obtendrá, solo agrupe por el id_bebidas (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 de campo, ya que lo más probable es que desee dividir esto nuevamente en el lado del cliente. Tampoco es una función agregada de SQL estándar.