89 votes

SELECT * FROM multiple tables. MySQL

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

donne 5 lignes (5 tableaux), photo est le seul champ unique dans une ligne. name, price sont répétés ( ici, fanta- name, price répétez 3 fois. ) Comment puis-je me débarrasser de ces doublons ?

Edit : Je veux name, price et tout photo pour chaque boisson.

 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

121voto

leemes Points 17391

Ce que vous faites ici s'appelle un JOIN (bien que vous le fassiez implicitement parce que vous sélectionnez dans plusieurs tables). En d'autres termes, si vous n'avez pas mis de conditions dans votre clause WHERE, vous aviez toutes les combinaisons de ces tables. Avec votre condition, 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 drinks_id particulier. Votre déclaration ne restreint pas dont la ou les photos 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 drinks_id particulier. Pour cela, vous avez besoin d'un regroupement et d'un fonction agrégée . Vous indiquez à SQL les entrées que vous souhaitez regrouper (par exemple, tous les numéros de boissons égaux) et dans le SELECT, vous devez indiquer laquelle des entrées distinctes de chaque ligne de résultats regroupés doit être prise. Pour les nombres, il peut s'agir de la moyenne, du minimum ou du maximum (pour n'en citer que quelques-uns).

Dans votre cas, je ne vois pas l'intérêt d'interroger les photos pour les boissons si vous ne voulez qu'une seule ligne. Vous avez probablement pensé que vous pourriez avoir un série de photos dans votre résultat pour chaque boisson, mais SQL ne peut pas faire ça. Si vous voulez seulement tout photo et que vous ne vous souciez pas de ce que vous obtiendrez, regroupez simplement par le 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 également GROUPE_CONCAT si vous voulez 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 des champs, car il est fort probable que vous souhaitiez diviser à nouveau ces valeurs du côté client. Il ne s'agit pas non plus d'une fonction d'agrégation SQL standard.

3voto

AnandPhadke Points 5990

Vous aurez ici les valeurs dupliquées pour le nom et le prix. Et les identifiants sont en double dans la table drinks_photos. Il n'y a aucun moyen de les éviter. De plus, que voulez-vous exactement comme résultat ?

2voto

bhovhannes Points 1349

Afin de se débarrasser des doublons, vous pouvez regrouper par drinks.id . Mais de cette façon, vous n'aurez qu'une seule photo pour chaque drinks.id (la photo que vous obtiendrez dépend de l'implémentation interne de la base de données).

Bien qu'il ne soit pas documenté, dans le cas de MySQL, vous obtiendrez la photo avec le plus bas id (dans mon expérience, je n'ai jamais vu un autre comportement).

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X