IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Recherche dans une table mysql et comparaison [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    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 ?

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    la meilleurs solution serai de créer une table caractéristique.

    mysql 3.23 ??? tu sors d'un coma ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    euh oui c'est le principe d'une base de donnée...
    et c'est tout simplement LA meilleur solution

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Dans ce cas pouvez-vous me dire comment je dois implémenter la table caractéristique

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si, c'est juste que tu ne sais pas faire la requete...

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Qu'est ce que vous proposez?

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par hat_et_m Voir le message
    Qu'est ce que vous proposez?
    sans avoir la table je dirais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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')

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    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?

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    fais bien correspondre les noms de champs et table (ex : produits)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Rechercher dans une table MySql
    Par tremeur53 dans le forum Requêtes
    Réponses: 9
    Dernier message: 27/05/2007, 17h20
  2. Problème d'insertion dans une table MYSQL
    Par greg69 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/10/2005, 11h34
  3. Nombre d'enregistrement dans une table MySQL
    Par tom06440 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 21/10/2005, 19h07
  4. Comment importer un document CSV dans une table MySql ?
    Par magic8392 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/02/2005, 11h03
  5. recherche dans une table Access en ASP
    Par D-D dans le forum ASP
    Réponses: 3
    Dernier message: 09/06/2004, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo