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 :

[SQL] Id séparés par des virgules et requête de sélection


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Par défaut [SQL] Id séparés par des virgules et requête de sélection
    Bonjour,

    Je cherche à faire une requête qui sort un peu de l'ordinaire... J'aurais besoin d'un petit coup de main si ça ne vous dérange pas.

    Voici ma situation :

    J'ai une table sql "members" qui contient, entre autres, un champ appellé "read".
    Dans ce champ, sont stockés un certain nombre d'id séparés par des virgules (plus précisément sous cette forme : "$id1, $id2, $id3, $id4,").

    Je cherche à faire un requête en php qui me permettra de voir si $id fait partie des id contenus dans le champ "read". Pour ça je pense qu'il faut découper les id sur les virgules... Mais je ne sais pas du tout quelle procédure suivre.

    Si vous pouviez m'aiguiller un peu

    Merci par avance.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Pour MySQL, je pense qu'il existe plus intéressant et direct : la fonction find_in_set.

    Exemple (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = mysql_query("SELECT * FROM ma_table WHERE FIND_IN_SET($id, read) <> 0");

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Par défaut
    En effet, ça parait simple Je n'ai pas encore testé.

    Je me pose juste une question : imaginons que le champ contienne les id suivants :
    "45, 78, 5, 17,"

    Si on fait FIND_IN_SET(7, read), est-ce qu'il ne risque pas de nous retourner 78 et 17, alors que je veux vérifier si le chiffre 7 existe ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par Emotion
    Si on fait FIND_IN_SET(7, read), est-ce qu'il ne risque pas de nous retourner 78 et 17, alors que je veux vérifier si le chiffre 7 existe ?
    Je ne vous l'aurais pas proposé sinon (7 étant justement testé comme nombre et non comme chiffre d'après vos explications)

    Par contre votre formatage particulier des données ne va pas sans poser quelques soucis, il faudrait se débarrasser au passage des espaces, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = mysql_query("SELECT * FROM ma_table WHERE FIND_IN_SET($id, REPLACE(read, ' ', '')) <> 0");
    Par contre, quand on en arrive à regrouper plusieurs données dans un même champ, il est généralement conseillé de revoir la conception de ses tables

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Par défaut
    Citation Envoyé par julp Voir le message
    Par contre votre formatage particulier des données ne va pas sans poser quelques soucis, il faudrait se débarrasser au passage des espaces, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = mysql_query("SELECT * FROM ma_table WHERE FIND_IN_SET($id, REPLACE(read, ' ', '')) <> 0");
    Je ne mettrai pas d'espace au moment de l'insertion, ce sera plus simple (et même plus économique en nombre de caractères).

    Citation Envoyé par julp Voir le message
    quand on en arrive à regrouper plusieurs données dans un même champ, il est généralement conseillé de revoir la conception de ses tables
    Qu'est-ce que vous entendez par "revoir la conception" ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par Emotion
    Qu'est-ce que vous entendez par "revoir la conception" ?
    Si ces identifiants font référence à d'autres données, il s'agit d'une relation [0|1],N à [0|1],N donc une nouvelle table ferait son apparition pour lier les deux précédentes (au travers de leurs clés primaires).

    Un exemple sera certainement plus parlant : une gestion de groupes d'utilisateurs (les clés primaires sont en gras et les clés étrangères en italique).
    • Une première table utilisateurs :
      • util_id : l'identifiant
      • util_nom : le login
      • util_email : l'email
      • ...
    • Une deuxième table groupes :
      • grp_id : l'identifiant
      • grp_nom : le nom du groupe
      • ...
    • Une troisième table pour marquer l'appartenance d'un utilisateur à zéro, un ou plusieurs groupes :
      • util_id (cf table utilisateurs)
      • grp_id (cf table groupes)

    Cette troisième table évite d'avoir un champ supplémentaire dans la table groupes ou utilisateurs, qui peut éventuellement être physiquement limité (c'est surtout vrai avec du varchar). Ceci facilite notamment les requêtes (jointures) et la mise à jour de ces données (on peut facilement supprimer un utilisateur d'un groupe ou un groupe complet notamment si on utilise un moteur innodb qui permet les suppressions en cascade).

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2015, 06h45
  2. [XL-2003] Extraire Mots séparé par des virgules
    Par guigui69 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 04/05/2011, 18h15
  3. [MySQL] Alimenter un tableau par des string séparés par point virgule
    Par Zikas-r dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/04/2009, 11h19
  4. Jointure vers des ID séparés par des virgules (possible ?)
    Par le_binr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/05/2008, 01h46
  5. Lignes d'une colone séparés par des virgules.
    Par Wahid.Net dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 09/02/2008, 01h47

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