Recherche multicritères

Alex7000
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 15:31

Bonjour à vous tous,
J'ai un soucis de conception de requète MySQL (en PHP)

Je vais essayer d'être le plus simple et clair possible ... :roll:

J'ai une table dans laquelle il y a ces informations


(il y a des "id" (chiffres) à la place des "mots")
ID | VOITURE | CRITERES | SPEC |
----------------------------------------------
1 | CAR1 | Couleur | rouge |
2 | CAR1 | Type | sport |
3 | CAR2 | couleur | vert |
4 | CAR2 | Type | Break |
5 | CAR3 | Couleur | rouge |
6 | CAR3 | Type | sport |
...

J'aimerai retrouver les Voitures de "Sport" de couleur "Rouge"... Mais distinctement.

Comme puis-je faire ?
Merci de votre aide.

Alex.

ViPHP
ViPHP | 5462 Messages

03 juin 2010, 15:33

hello, ta essayé quoi comme requête pour le moment ? :wink:

Eléphanteau du PHP | 19 Messages

03 juin 2010, 15:35

Comme ca :
SELECT * 
FROM taTable
WHERE CRITERES="Couleur" AND SPEC="rouge";
?

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 15:38

J'ai essayé :

SELECT DISTINCT (id_car) FROM ma_table WHERE ((CRITERE='Couleur ') And (SPEC ='rouge')) AND ((CRITERES ='Type') And (SPEC ='sport '))

Avec des "AND" et "OR"

Merci de ta réponse :)

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 15:40

sebcap26 merci,

Mais j'aimerai avoir le résultat avec au moins deux critères ?

Les voitures de couleur "rouge" mais aussi de "sport"

ViPHP
ViPHP | 5462 Messages

03 juin 2010, 15:51

je trouve la conception de la base un peu bizarre, version bidouille ca donnerais ca :
SELECT *, COUNT(voiture) AS nombre
FROM taTable
WHERE (criteres='couleur' AND spec = 'rouge') OR (criteres='type' AND spec = 'sport')
GROUP BY voiture
HAVING nombre = 2

Eléphanteau du PHP | 19 Messages

03 juin 2010, 16:09

A oui ok j'ai mal compris la question, autant pour moi.

A part la solution de stealth35, avec des and et des or, je vois pas d'autre moyen.

Sinon je trouve la bdd assez mal faite, je te conseille de revoir son design, ca pourrait simplifier les choses.

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 16:11

stealth35 merci de ta réponse,

J'ai essayé et cela fonctionne (semble t-il) mais sans mettre à la fin : "HAVING nombre = 2"

Je ne sais pas très bien à quoi cela sert... J'ai regardé sur Internet mais c'est du charabia pour moi ! :(

Merci pour ton aide.

Et si je veux ajouter un nouveau critère je peux faire (par ex.) :
SELECT *, COUNT(voiture) AS nombre
FROM taTable
WHERE (criteres='couleur' AND spec = 'rouge') OR (criteres='type' AND spec = 'sport') [color=#000080]OR (criteres='porte' AND spec = '4')[/color]
GROUP BY voiture
Je vais faire des tests.

Merci
Alex

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 16:13

sebcap26 merci de ta réponse
Pas de soucis :)

Ce n'est pas ma base de données... Je fais avec !? :(

Merci
Alex.

ViPHP
ViPHP | 5462 Messages

03 juin 2010, 16:14

rajoute une voiture car4 vert sport, elle sera compté dedan si tu met pas HAVING
"nombre" permet de récupère le nombre de critère suivant le groupe, il va donc t'afficher 2 car1 , 2 car3, 1 car4
comme on veux pour les 2 critères alors on prend le groupe qui comprend 2 voitures (2 fois la même)

EDIT : si tu veux rajoute un nouveau critere, tu remets une condition en plus et nombre devrai etre égale a 3

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 16:20

stealth35,

Si je comprend bien le "HAVING nombre = 2"
C'est pour dire en gros ... "Seulement ceux qui on les "2" critères à la fois" !?

Si j'ajoute un nouveau critère alors je devrais mettre cela "HAVING nombre = 3" !?

Ai-je bien compris !?

Merci
Alex

ViPHP
ViPHP | 5462 Messages

03 juin 2010, 16:35

stealth35,

Si je comprend bien le "HAVING nombre = 2"
C'est pour dire en gros ... "Seulement ceux qui on les "2" critères à la fois" !?

Si j'ajoute un nouveau critère alors je devrais mettre cela "HAVING nombre = 3" !?

Ai-je bien compris !?

Merci
Alex

ta tout compris :wink:

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2010, 16:43

:)
Merci beaucoup

bonne journée à vous tous

Alex.