Videos streaming images jeux et buzz
Connexion






Perdu le mot de passe ?

Inscrivez-vous maintenant !
Menu Principal
Communauté




CrazyCow
Aide avec une requête SQL
 1  #1
Je poste trop
Inscrit: 29/07/2008 00:26
Post(s): 18965
Karma: 29791
Base : MySQL 5.7 InnoDB

Je bloque sur un problème qui me parait pourtant assez basique, mais je tourne en rond... Voici la situation (exemple) :


Table 1 : objet

id_obj*      titre_obj
1            SuperObjet
2            ObjetPourri


Table 2 : meta

id_meta*     titre_meta
1            Beauté
2            Couleur


Table 2 : meta_data

fk_id_obj*    fk_id_meta*   data_value
1             1             Joli
1             2             Jaune
2             1             Laid

* Clé primaire


Donc comme on peut le voir, des objets ont certaines propriétés (meta). Certains meta peuvent ne pas être complétés. Il ne peut y avoir qu'une valeur par meta et par objet (un objet ne peut pas être jaune et bleu à la fois).

Mon but est de faire un formulaire de filtrage/recherche qui permette de retourner les objets selon les propriétés définies.

Résultat attendu :
- Si on sélectionne Joli > Objet 1
- Si on sélectionne Joli et Jaune > Objet 1
- Si on sélectionne Laid et Jaune > Rien

Depuis mon formulaire je me retrouve avec un tableau de fk_id_meta et de leur valeur souhaitée (data_value). La requête est donc à construire avec les deux tables objet et meta_data je suppose. J'aimerais que soient retournés tous les champs des objets (id et titre en l'occurrence). Je ne sais pas si je dois utiliser des =, des GROUP BY, LEFT JOIN... je suis perdu

Si quelqu'un me trouve la requête SQL correspondante je lui fais un gros poutou !

Contribution le : 05/09/2019 15:07
_________________
🏆🏆 K TROPHY
À un moment donné, il faut lâcher prise. Claude François
Signaler

-Flo-
 2  #2
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@CrazyCow Tu as plusieurs manières d'y parvenir, mais celle que je trouve la plus simple est de faire une jointure sur ta table meta_data pour chaque critère. Donc 2 jointures dans le cas de 2 critères.

Exemple :

Citation :

mysql> select id_obj from objet inner join meta_data as md1 on id_obj = md1.fk_id_obj where md1.data_value = 'Joli';
+--------+
| id_obj |
+--------+
|      1 |
+--------+
1 row in set (0,00 sec)

mysql> select id_obj from objet inner join meta_data as md1 on id_obj = md1.fk_id_obj inner join meta_data as md2 on id_obj = md2.fk_id_obj where md1.data_value = 'Joli' and md2.data_value = 'Jaune';
+--------+
| id_obj |
+--------+
|      1 |
+--------+
1 row in set (0,00 sec)

mysql> select id_obj from objet inner join meta_data as md1 on id_obj = md1.fk_id_obj inner join meta_data as md2 on id_obj = md2.fk_id_obj where md1.data_value = 'Laid' and md2.data_value = 'Jaune';
Empty set (0,00 sec)


Contribution le : 05/09/2019 15:31
_________________
Signaler

CrazyCow
 0  #3
Je poste trop
Inscrit: 29/07/2008 00:26
Post(s): 18965
Karma: 29791
@-Flo- Ah oui ! C'est top. Jamais j'aurais pensé à cette solution !
J'ai juste ajouté dans le WHERE une condition supplémentaire pour que l'id_meta corresponde, pour éviter que l'objet soit retourné en cas de valeur identique dans un autre meta.

Merci beaucoup ! Voilà le poutou amplement mérité :


Contribution le : 05/09/2019 16:10
_________________
🏆🏆 K TROPHY
À un moment donné, il faut lâcher prise. Claude François
Signaler

-Flo-
 1  #4
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@CrazyCow Cool ! J'y appose ma fesse gauche.

Contribution le : 05/09/2019 16:14
_________________
Signaler

GrossePatate
 0  #5
Je suis accro
Inscrit: 14/02/2017 14:50
Post(s): 954
Karma: 974
+1 @-Flo-

C'est propre !

Contribution le : 07/09/2019 17:14
Signaler


 Haut   Précédent   Suivant






Si vous êtes l'auteur d'un élément de ce site, vous pouvez si vous le souhaitez, le modifier ou le supprimer
Merci de me contacter par mail. Déclaré à la CNIL N°1031721.