ibé Posté 20 Mai 2005 Posté 20 Mai 2005 Hello, J'ai besoin d'un peu d'aide pour une fonction en php. Je donne un exemple par facilité. Une base sql appellé base1 dans celle-ci plusieurs table table1, table2, table3 ... Dans table 1 j'ai une colonne (champ) appellé "section" qui possède plusieurs valeurs numérique séparé par des virgules. Par exemple section 2,9,25 je veux selectionner tous ceux qui on la valeur 25 dans section. $select = 'SELECT count(section) FROM table1 WHERE section = 25'; apparement le séparateur (,) pose problème si j'avais eu 25,2,9 la selection aurait eu lieu mais là ca ne va pas... Je n'ai pas trouvé de solution c'est pourquoi je me tourne vers vous. Merci, ibé
Anonymus Posté 20 Mai 2005 Posté 20 Mai 2005 Disons que la facon dont tu as formaté ta table table1 n'est pas la plus commode. On va prendre le cas de : 2,9,25 Il faut distinguer 3 cas : - 25 peut être en premier (exemple : 25,2,9) - 25 peut être au milieu (exemple : 2,25,9) - 25 peut être à la fin (exemple : 2,9,25). Donc, on va faire 3 SELECT : SELECT count(section) FROM table1 WHERE section LIKE '25,%'; SELECT count(section) FROM table1 WHERE section LIKE '%,25,%'; SELECT count(section) FROM table1 WHERE section LIKE '%,25'; Autrement dit, on teste le cas où 25 est en premier, ou s'il est au milieu, ou à la fin. Evidement, on peut rassembler ces 3 cas, ca donne : SELECT count(section) FROM table1 WHERE section LIKE '25,%' XOR section LIKE '%,25,%' XOR section LIKE '%,25'; Les XOR sont là juste pour le plaisir, on ne s'en sert que très peu. Par contre, 25 ne peut être en meme temps au début, au milieu et à la fin. Donc, c'est assez pertinent. On doit ainsi obtenir toutes les réponses, quelque soit la place de 25... Toutes ? Sauf une Celle où seul 25 est présent (à moins que '25' seul soit suivi d'une virgule ? ) On pourrait donc affiner la recherche ainsi, pour donner le résultat final : SELECT count(section) FROM table1 WHERE section LIKE '25,%' XOR section LIKE '%,25,%' XOR section LIKE '%,25' XOR section LIKE '25'; Anonymus.
ibé Posté 20 Mai 2005 Auteur Posté 20 Mai 2005 (modifié) Super, les XOR me voilà avec un nouveau truc à retenir Ca fonctionne à 200% Modifié 20 Mai 2005 par ibé
jpv Posté 20 Mai 2005 Posté 20 Mai 2005 (modifié) Bonjour, Il y à une manière beaucoup plus simple de réaliser ce genre de selection en utilisant les expressions régulières MySql avec REGEXP. JP Modifié 20 Mai 2005 par jpv
Anonymus Posté 20 Mai 2005 Posté 20 Mai 2005 D'un coté, oui, c'est une solution, ca marche très bien avec : 2,9,25 2,25,9 25,2,9 mais aussi: 125,2 2,255,9 etc.. D'un autre coté, je ne voudrais pas imposer les regex à Ibé
jpv Posté 20 Mai 2005 Posté 20 Mai 2005 (modifié) Tres juste, J'ai d'ailleurs édité mon précédent message pour eviter de devoir donner des explications plus détaillé sur l'ecriture des motifs d'expressions régulières En revanche, voici une astuce que j'utilise assez souvent pour gérer des valeurs multiples. Pour reprendre l'exemple de ibé, une solution consiste à stocker les valeur multiples non plus sous forme de liste enumérative (2,9,25) mais sous une forme plus triviale en utilisant un caractère de séparation, ce qui nous donne (-2-9-25-) Il est alors possible de faire jouer une expression regulière à motif simple : SELECT count(section) FROM table WHERE section REGEXP '(-25-)' Ce qui nous garantis une discrimination correcte de la recherche. jp Modifié 20 Mai 2005 par jpv
Anonymus Posté 21 Mai 2005 Posté 21 Mai 2005 Bon, dans le meme ordre d'idées, les prog. open source qui font ce genre de manips utilisent le meme procédé, avec un 'espace'. Il est très facile de récupérer un élément, de le nettoyer de son séparateur, etc.. Voilà, que de bonnes choses en perspective
ibé Posté 21 Mai 2005 Auteur Posté 21 Mai 2005 (modifié) Oulà j'ai jeté un oeil sur regexp EDIT [Question stupide retiré pour ne pas passer dans le bétisier du hub ] Merci pour votre aide ibé Modifié 21 Mai 2005 par ibé
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant