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

PHP & Base de données Discussion :

requête spéciale (caractéristique de fiche) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut requête spéciale (caractéristique de fiche)
    Bonjour,

    Je vous explique mon problème, ma structure de données est la suivante :

    table : Fiche {Id}
    table : caracteristique {Id,Valeur,Id_fiche,Id_type}
    table : TypeCaracteristique {Id,Libelle}


    exemple:
    TypeCaracteristique
    {1,nom commun}
    {2,nom latin}
    {3,famille}
    Fiche 1
    Caracteristique {id = 1, valeur = nom commun 1, id_fiche = 1, Type = 1
    Caracteristique {id = 2, valeur = thymelacées, id_fiche = 1, Type = 2
    Caracteristique {id = 3, valeur = arbre, id_fiche = 1, Type = 3
    Fiche 2
    Caracteristique {id = 4, valeur = nom commun 2, id_fiche = 2, Type = 1
    Caracteristique {id = 5, valeur = begoniacée, id_fiche = 2, Type = 2
    Caracteristique {id = 6, valeur = arbre, id_fiche = 2, Type = 3
    Fiche 3
    Caracteristique {id = 7, valeur = nom commun 3, id_fiche = 3, Type = 1
    Caracteristique {id = 8, valeur = begoniacée, id_fiche = 3, Type = 2
    Caracteristique {id = 8, valeur = arbre, id_fiche = 3, Type = 3
    mon problème étant de construire une requête en php permettant d'effectuer des filtres sur tout les types de caractéristiques.

    exemple : requette permettant de recuperer les fiches avec
    un nom commun contenant "nom"
    ET un nom latin = "begoniacée"
    ET une famille = "arbre"
    Celui-ci devrait me retourner uniquement la fiche 2 et 3.

    Merci

    Kévin

  2. #2
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    J'aurai fait une seule table

    table = {ID, nom commun ,nom latin,famille}
    Et tu fais une requête du genre :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT * FROM $table 
    WHERE nom_commun LIKE '" . $nom_commun . " %' 
    AND nom_latin = '" . $nom_latin . "'
    AND famille = '" . $famille . "' ORDER BY ..."

    Mais il serait préférable de faire une recherche en Full-Text avec SELECT ... MATCH

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Oui comme cela , cest beaucoup plus simple. Mais en fait , les Type de caractéristique sont dynamiques. Je peux en rajouter autant que je le veut et définir une caractéristique pour chaque type de carac.

  4. #4
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    mais les types, c'est quoi par exemple ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    je l'ai précisé dans le 1er message. J'explique le context.
    Il s'agit de gérer des fiches de plantes.
    Une plante possède des caractéristiques (nom commun, nom latin , hauteur, type, etc) représenté par mon objet TypeCaractérstique.

    Mon modèle est un modèle EAV (tout est dynamique et paramétrable).

  6. #6
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    ben alors je ferai 2 tables

    Comme le nom commun et le nom latin seront toujours renseignés, je ferai une première table
    plante {id, nom_commun, nom_latin}
    Puis une deuxième table :
    plante_attribut {id, plante_id, attribut, valeur}

    Ainsi par exemple tu peux avoir une ligne
    plante {1, 'begonia', 'begonius magnificus' } et
    plante_attribut {1, 1, 'famille', 'begoniacee'}
    plante_attribut {2, 1, 'hauteur', '100cm'}
    plante_attribut {3, 1, 'couleur', 'rouge'}
    etc
    tu pourras donc mettre plusieurs attributs pour chaque plante
    par contre, si tu fais une recherche en fonction d'un attribut, il te faudra jongler avec les tables dans la requête (Jointure)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    En fait , ma contrainte est que je ne peux pas toucher au modèle. Je dois essayer de trouver une requête permettant de faire des filtres multiples.
    Dans ce que tu viens de m’énoncer, tu as juste sorti le nom commun. Le problème persisterai quand même pour les filtres sur les autres caractéristiques.

    C'est pas le modèle qui possède problème (il est générique) mais plutôt la requête.

    Merci

  8. #8
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonsoir,

    C'est plus un problème de requêtes SQL que de PHP non ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SELECT Id
    FROM Fiche
    WHERE Id IN (
                      (SELECT id_fiche
                       FROM caracteristique
                       WHERE valeur LIKE "%nom%"
                        AND Id_type = (SELECT Id
                                              FROM TypeCaracteristique
                                              WHERE Libelle = "nom commun") //voir utiliser id directement puique normalement tu sais du quel il s agit
                       )
                       UNION
                       (SELECT id_fiche
                        FROM caracteristique
                        WHERE valeur LIKE "%begoniacée%"
                        AND Id_type = 2) //Comme dit précédemment si tu connais le type utilise cette forme directement
    )

    Un truc du genre ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Oui c'est un problème de requête SQL . Ta solution me parait pas mal . Je vais la tester .

    Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup humitake , tu m'as mi sur la bonne voie. Ce qu'il me fallait c'était une intersection et non un union.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (SELECT Id_Fiche
        FROM Caracteristique
        WHERE valeur LIKE "%fleur%"
        AND Id_TypeCaracteristique = 1 -- nom commun
        AND Id_Fiche IN 
     
     (SELECT Id_Fiche
        FROM Caracteristique
        WHERE valeur = '16' -- Berberidacées
        AND `Id_TypeCaracteristique` = 13) -- Famille

    Il me reste plus qu'à généré ça en php.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête spéciale
    Par superkiller dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/06/2013, 15h45
  2. requête spéciale (caractéristique de fiche)
    Par superkiller dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/05/2013, 18h38
  3. Requête spéciale dans le cas d'une relation plusieurs à plusieurs
    Par Chauve souris dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/05/2013, 21h32
  4. [Oracle] Exécution d'une requête spéciale
    Par Dark Ryus dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/08/2008, 10h27
  5. Requête spéciale paramètre en champ
    Par ouma59 dans le forum Access
    Réponses: 1
    Dernier message: 18/07/2006, 17h31

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