una - SELECCIONAR*FROM mĂșltiples tablas. MySQL
seleccionar un campo de una tabla mysql (3)
SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id
yeilds 5 filas (5 arrays), la photo
es el único campo único en una fila. name, price
se repite ( aquí, fanta-
name, price
repite 3 veces ) . ¿Cómo me deshago de estos duplicados?
Editar: Quiero name, price
y todas las photo
para cada bebida.
id name price
1. fanta 5
2. dew 4
id photo drinks_id
1. ./images/fanta-1.jpg 1
2. ./images/fanta-2.jpg 1
3. ./images/fanta-3.jpg 1
4. ./images/dew-1.jpg 2
5. ./images/dew-2.jpg 2
Lo que haces aquí se llama JOIN
(aunque lo haces implícitamente porque seleccionas de 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 usted restringe su unión a esas 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 fotos X con este drink_id en particular. ¡Su estado de cuenta no restringe qué foto (s) desea tener!
Si solo desea una fila por bebida, debe indicarle a SQL lo que desea hacer si hay varias filas con un drink_id en particular. Para esto necesita agrupar y una función agregada . Le dice a SQL qué entradas desea agrupar juntas (por ejemplo, todas drinks_ids iguales) y en el SELECT, debe indicar cuál de las entradas distintas 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 puedo ver el sentido de consultar las fotos para tomar algo si solo quiere una fila. Probablemente pensaste que podrías tener una variedad de fotos en tu resultado para cada bebida, pero SQL no puede hacer esto. Si solo quieres una foto y no te importa cuál conseguirás, solo agrégala junto con el drink_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 ser peligroso si lo tiene ,
dentro de los valores de campo, ya que lo más probable es que quiera dividir esto nuevamente en el lado del cliente. Tampoco es una función agregada de SQL estándar.
Para deshacerse de los duplicados, puede drinks.id
por drinks.id
. De esta forma, obtendrá solo una foto por cada drinks.id
(la foto que obtendrá dependerá de la implementación interna de la base de datos).
Aunque no está documentado, en el caso de MySQL, obtendrá la foto con el id
más bajo (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
Tendrás 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 que pueda evitarlos. ¿Qué es exactamente lo que quiere la salida?