Aller au contenu

Problème avec "select from where"


Sujets conseillés

Posté

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é

Posté

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 :D

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.

Posté (modifié)

Super, les XOR me voilà avec un nouveau truc à retenir :P

Ca fonctionne à 200%

Modifié par ibé
Posté (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é par jpv
Posté

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é ;)

Posté (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é par jpv
Posté

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 ;)

Posté (modifié)

Oulà j'ai jeté un oeil sur regexp :blink:

EDIT [Question stupide retiré pour ne pas passer dans le bétisier du hub :lol: ]

Merci pour votre aide :)

ibé

Modifié par ibé

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...