Mysql
 sql >> Base de données >  >> RDS >> Mysql

SELECT * FROM plusieurs tables. MySQL

Ce que vous faites ici s'appelle un JOIN (bien que vous le fassiez implicitement parce que vous sélectionnez parmi plusieurs tables). Cela signifie que si vous n'avez mis aucune condition dans votre clause WHERE, vous aviez toutes les combinaisons de ces tableaux. Ce n'est qu'avec votre condition que vous limitez votre jointure aux lignes où l'identifiant de la boisson correspond.

Mais il y a toujours X lignes multiples dans le résultat pour chaque boisson, s'il y a X photos avec ce drink_id particulier. Votre déclaration ne limite pas quel photo(s) que vous voulez avoir !

Si vous ne voulez qu'une ligne par boisson, vous devez indiquer à SQL ce que vous voulez faire s'il y a plusieurs lignes avec un drink_id particulier. Pour cela, vous avez besoin d'un regroupement et d'une fonction d'agrégation . Vous indiquez à SQL quelles entrées vous souhaitez regrouper (par exemple, tous les drink_ids égaux) et dans le SELECT, vous devez indiquer laquelle des entrées distinctes pour chaque ligne de résultat groupée doit être prise. Pour les nombres, cela peut être moyen, minimum, maximum (pour n'en nommer que quelques-uns).

Dans votre cas, je ne vois pas le sens d'interroger les photos pour les boissons si vous ne voulez qu'une seule ligne. Vous avez probablement pensé que vous pouviez avoir un tableau de photos dans votre résultat pour chaque boisson, mais SQL ne peut pas le faire. Si vous ne voulez que tout photo et peu importe ce que vous obtiendrez, regroupez simplement par drinks_id (afin d'obtenir une seule ligne par boisson) :

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

Dans MySQL, nous avons aussi GROUP_CONCAT , si vous souhaitez que les noms de fichiers soient concaténés en une seule chaîne :

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

Cependant, cela peut devenir dangereux si vous avez , dans les valeurs de champ, car vous souhaiterez probablement le diviser à nouveau du côté client. Ce n'est pas non plus une fonction d'agrégation SQL standard.