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 SQL Discussion :

Requete WHERE LIKE sur un champ VARCHAR contenant des variables separees par des virgules


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Requete WHERE LIKE sur un champ VARCHAR contenant des variables separees par des virgules
    Bonjour

    j'ai une table produit dans laquelle le champ id_vitrine contient les differents ID des vitrines dans lesquelles on le trouve ces id_vitrine sont concatenes et separes par des virgules (par exemple "1,5,12,14")

    Pour savoir si je l'affiche en fonction de la vitrine ou je me trouve, je fais cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query_pdt = "SELECT * FROM produit WHERE id_vitrine LIKE '%".$id_vitrine."%' ";
    Le probleme c'est que si l'ID de la vitrine recherchee est 1 il m'affiche aussi les produits dont l'id_vitrine contient "12"

    Comment rechercher uniquement si la variable 1 est dans la chaine en evitant 11, 12 et 13 par exemple

    Merci pour votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ton problème démontre que ton modèle de données est mauvais !

    Règle de gestion :
    Un produit peut être contenu dans plusieurs vitrines et une vitre peut contenir plusieurs produits.

    Schéma MCD de la méthode Merise :
    Vitrine -0,n----Contenir----0,n- Produit

    Tables qui en découlent :
    Vitrine (v_id, ...)
    Produit (p_id, ...)
    Contenu_vitrine (cv_id_produit, cv_id_vitrine...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Je rejoins CinePhil, la meilleure solution c'est de changer ton modèle de donnée.

    Mais si tu veux faire dans le rapide, ce que je te déconseille très fortement ou si tu ne peux vraiment pas faire autrement ...
    Tu peux inclure les virgules dans ton LIKE
    Il faudra au préalable faire en sorte que toutes tes valeurs commencent et terminent par une virgule.
    Un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE produit SET id_vitrine = ',' || id_vitrine || ',';
    mettra une virgule en début et fin de chaque id_vitrine de ta table

    mais c'est vraiment du bidouillage moche

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il n'est pas nécessaire d'updater la colonne id_vitrine, les virgules peuvent être rajoutées dans le WHERE.
    Oui ça reste du "bidouillage moche" et contre-performant, mais s'il n'a pas la main sur la structure de la base, c'est toujours une solution.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Je ne te suis pas, Snipah.
    Qu'entends-tu par "les virgules peuvent être rajoutées dans le WHERE"

    Si le champ est '1,2,11,13'

    Si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE id_vitrine LIKE '%,1,%'
    la valeur ci-dessus sera ignorée car pas de virgule avant le 1.
    Même chose avec 13

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    En admettant que l'opérateur de concaténation soit || comme dans votre premier post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE ',' || id_vitrine || ',' LIKE '%,1,%'

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Effectivement je n'y avais pas pensé.

    En espérant que ça serve au principal intéressé par ce topic.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Merci a tous
    J'ai suivi vos conseils et donc repense mon modele de donnees

    j'ai dorenavant une troisieme base qui stocke l'identifiant produit et l'identifiant vitrine chaque fois que necessaire

    je n'ai plus qu'a faire une requete croisee et ca fonctionne

    merci

Discussions similaires

  1. SQL Server 2012 - requete de date sur un champ varchar
    Par Wiwi31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/03/2014, 11h38
  2. Réponses: 4
    Dernier message: 29/09/2010, 15h38
  3. Tri sur un champ VARCHAR
    Par hisy dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 15/02/2006, 17h02
  4. Requete avec filtre sur un champ
    Par podz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2005, 14h37
  5. Recherche d'un mot avec LIKE sur plusieurs champs
    Par reynhart dans le forum Langage SQL
    Réponses: 16
    Dernier message: 26/11/2004, 17h41

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