Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/02/2011, 14h49   #1
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Par défaut Recherche dans une table mysql et comparaison

Bonjour,

Voici mon problème :

Je stocke les caractéristiques de mes produits dans un champ 'caracteristiques' sous la forme d'une chaine de caractères :

/*caracteristique1*/valeur1/*caracteristique1*//*caracteristique2*/valeur2/*caracteristique2*//*caracteristique3*/valeur3/*caracteristique3*//*caracteristique4*/valeur4/*caracteristique4*/

où valeur4 est un nombre exemple 452.

Je voudrais effectuer une comparaison à partir de données d'un formulaire où je sélectionne les valeurs de caracteristique4 < 150

comment est-il possible avec une requete mysql 3.23 de réaliser la recherche des valeurs de caracteristique4 inférieures à 150 puis même question pour des valeurs supérieures à 400 et meme question aussi pour des valeurs comprises entre 150 et 400 ?

-----------------------
une idée serait d'extraire valeur4 avec une expression régulière en mysql puis la comparer à 150 si on cherche les valeurs de caracteristique4 inférieures à 150.
avec une requete mysql du genre :

SELECT * FROM table_produits WHERE( 150 > ( caracteristiques REGEXP '/\*caracteristique4\*/(.*)/\*caracteristique4\*/') )


Est-ce une bonne solution ? En avez-vous une meilleure ?
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 16h22   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
la meilleurs solution serai de créer une table caractéristique.

mysql 3.23 ??? tu sors d'un coma ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/02/2011, 16h53   #3
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
J'ai essayé cette requete : ca fonctionne :

SELECT 150 > SUBSTRING(caracteristiques,LOCATE('/*a4*/',caracteristiques)+CHAR_LENGTH('/*a4*/'),LOCATE('/*a4*/',caracteristiques, LOCATE('/*a4*/',caracteristiques)+1)-LOCATE('/*a4*/',caracteristiques)-CHAR_LENGTH('/*a4*/')) ;

=> cela extrait la valeur comprise entre /*a4*/ entre /*a4*/ et cette valeur est comparée à 150.

il reste à implémenter...

une table caractéristique n'est pas une bonne solution à mon avis car on peut avoir différentes caractéristiques en fonction des produits.

A débattre...
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 16h59   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
euh oui c'est le principe d'une base de donnée...
et c'est tout simplement LA meilleur solution
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 17h13   #5
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Dans ce cas pouvez-vous me dire comment je dois implémenter la table caractéristique
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 17h17   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par hat_et_m Voir le message
Dans ce cas pouvez-vous me dire comment je dois implémenter la table caractéristique
table caracteristique :
id | id_produit | caracteristique | valeur


voir même faire une autre table si les caractéristiques sont récurrentes
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 17h44   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Pour préciser la réponse de stealth35, je te conseillerai de te ballader du côté des table dites EAV (Entity, Attribute, Value).
Elles sont très pratiques dans bien des situations. Mais n'oublie pas que ça ne remplace pas le design relationnel ça le complète avantageusement.
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h26   #8
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Comment fonctionnent ces tables dites EAV (Entity, Attribute, Value);

est-ce pratique dans le cas où l'on veut créer plusieurs caractéristiques par produit.

Quelle sera la relation entre la table produit et les EAV.

Merci de votre explication.
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h37   #9
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
stealth35,

la table caracteristique telle que vous la décrivez ne sera pas pratique dans le cas d'une recherche d'un produit sur la base d'une réunion de plusieurs caractéristiques : caracteristique1=valeur11 and caracteristique2=valeur22 and caracteristique3=valeur33 and ...

Voyez-vous
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 19h17   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par hat_et_m Voir le message
stealth35,

la table caracteristique telle que vous la décrivez ne sera pas pratique dans le cas d'une recherche d'un produit sur la base d'une réunion de plusieurs caractéristiques : caracteristique1=valeur11 and caracteristique2=valeur22 and caracteristique3=valeur33 and ...

Voyez-vous
on appelle ca des jointures, mais je vois surtout un gros manque de connaissance des SGBD la...
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 19h41   #11
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Admettons, si l'on part de la

table caracteristique :
id | id_produit | caracteristique | valeur
1 produit1 c1 v1
2 produit1 c2 v2
3 produit1 c3 v3
.
.
.
----------------------
On lance une requete de recherche du produit ayant les valeurs v1 ou v2
le résultat sera produit1

On lance une requete de recherche du produit ayant les valeurs v1 et v2
le résultat sera nul

Donc expliquez moi comment avec cette méthode on pourra réaliser des jointures de caractéristiques : avec and comme opérateur
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 20h07   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
y'a plein de façon de la faire, que ca soit avec des IN ou des JOIN,
http://dev.mysql.com/doc/refman/5.0/fr/join.html
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 21h15   #13
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Même en utilisant les jointures ou imbrications, le problème précédent subsite. On ne pourra pas obtenir avec cette structure de table, le résultat d'une recherche d'un produit impliquant plusieurs conditions de caractéristiques simultanées.

Il faudra toujours préciser WHERE( valeur='v1' and valeur='v2' ... )
Or cela donne un résultat nul et non produit1
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 21h20   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
si, c'est juste que tu ne sais pas faire la requete...
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 21h29   #15
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
J'ai fait ca :

SELECT * FROM produits INNER JOIN caracteristiques ON produits.ref_site=caracteristiques.id_produit WHERE(valeur='v2' and valeur='v1')

le résultat est nul ou plutot vide ce que je trouve logique compte tenu de la structure de la table caracteristiques
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 21h36   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par hat_et_m Voir le message
J'ai fait ca :

SELECT * FROM produits INNER JOIN caracteristiques ON produits.ref_site=caracteristiques.id_produit WHERE(valeur='v2' and valeur='v1')

le résultat est nul
sans faire le where tu dois bien voir si la jointure est bonne et il faut aussi choisir la caractéristique
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 21h42   #17
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Qu'est ce que vous proposez?
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 22h05   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par hat_et_m Voir le message
Qu'est ce que vous proposez?
sans avoir la table je dirais :

Code :
1
2
3
4
5
SELECT p.* FROM produit p
LEFT JOIN caracteristiques c1 ON p.id = c1.produit_id
LEFT JOIN caracteristiques c2 ON p.id = c2.produit_id
WHERE (c1.caracteristique = 'c1' AND c1.valeur = 'v1') 
  AND (c2.caracteristique = 'c2' AND c2.valeur = 'v2')
EDIT : voir même sans JOIN
Code :
1
2
3
4
SELECT p.* FROM produit p, caracteristiques c1, caracteristiques c2
WHERE p.id = c1.produit_id AND p.id = c2.produit_id
  AND (c1.caracteristique = 'c1' AND c1.valeur = 'v1') 
  AND (c2.caracteristique = 'c2' AND c2.valeur = 'v2')
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 22h16   #19
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Ca n'a pas l'air de fonctionner,

voici mes tables :

table produits :
ref_site | nom_produit | ....

et table caracteristiques :
id | id_produit | carac | valeur

les valeurs de id_produit correspondent à celles de ref_site

Quelle sera la requete dans ce cas?
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 22h21   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
fais bien correspondre les noms de champs et table (ex : produits)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h16.


 
 
 
 
Partenaires

Hébergement Web