Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 18/09/2007, 19h11   #1
Membre à l'essai
 
Inscription : octobre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 122
Points : 24
Points : 24
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.
__________________
http://www.studiz.fr/
Emotion est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 19h28   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Pour MySQL, je pense qu'il existe plus intéressant et direct : la fonction find_in_set.

Exemple (non testé) :
Code :
$sql = mysql_query("SELECT * FROM ma_table WHERE FIND_IN_SET($id, read) <> 0");
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 19h35   #3
Membre à l'essai
 
Inscription : octobre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 122
Points : 24
Points : 24
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 ?
__________________
http://www.studiz.fr/
Emotion est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 19h52   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
$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
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 20h22   #5
Membre à l'essai
 
Inscription : octobre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 122
Points : 24
Points : 24
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 :
$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" ?
__________________
http://www.studiz.fr/
Emotion est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 23h48   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h53.


 
 
 
 
Partenaires

Hébergement Web