Page 1 sur 1

Recherche précise dans un champs

Posté : 22 août 2005, 10:35
par krull
Bonjour

Dans une table, j'ai un champ avec une liste de nombres (la quantité de nombre peut varier: 53,54,59,23,590,12

Je cherche à savoir si, par exemple, le 59 est dans la liste.
$nb=59;
Je pensais faire ça dans ma requête :

lenombre LIKE '%$inb%' OR lenombre = '$nb'

Le pb est que si ma liste est : 53,54,23,590,12 (donc pas le 59), la requête retourne oui car il y a 590 !!

Comment faire pour sa voir que 59 est dans la liste sachant qu'elle peut être :
- 59
- 59,38
- 24,59,23
- rien
- 21,590,59

J'espère être clair ?
Merci à vous, j'ai bien du mal.
Krull

Posté : 22 août 2005, 10:43
par Ripat
Ouch! #-o

Je suppose que tu n'as pas envie de changer la structure de ta bdd?

Il y a bien une solution mais, gare aux performances !

Code : Tout sélectionner

SELECT * FROM ta_table WHERE ta_col REGEXP '(^|,)59(,|$)';

ouah, ?

Posté : 22 août 2005, 10:49
par krull
ca se lit comment ça ?
C'est quoi la différence avec like ?

Merci

Posté : 22 août 2005, 10:54
par Ripat
C'est une comparaison par expression régulière.

Code : Tout sélectionner

(^|,) soit début de chaîne, soit une virgule 59 le chiffre recherché (,|$) virgule ou fin de chaîne
Les opérateurs du LIKE ne permettent pas ce genre de gymnastique.

Le moteur de regex utilisé par MySQL est beaucoup plus rapide que celui de PHP (mais moins souple et complet) mais, tout de même, au niveau perfo, ce n'est pas l'idéal. Ca dépend de la taille de ta table.

A la rigueur la syntaxe ci-dessous pourrait être traduite par

Code : Tout sélectionner

SELECT * FROM ta_table WHERE ta_col LIKE '%,59,%' OR ta_col LIKE '59,%' OR ta_col LIKE '%,59' OR ta_col LIKE '59'

lol c'est ce que j'avais fait

Posté : 22 août 2005, 11:14
par krull
Merci bien

J'avais effectivement fait plusieurs like (et j'en avais oublié un) d'ou l'erreur.
Mais ton code est plus rapide.
J'espère que ça ne va pas trop ralentir.
En ce qui concerne la taille d'une base de données, j'ai du mal à me rendre compte !
A partir de combien de ligne on considère que la base commence à être importante ??
Merci

Re: lol c'est ce que j'avais fait

Posté : 22 août 2005, 11:29
par Ripat
A partir de combien de ligne on considère que la base commence à être importante ??
Merci
Ca dépend de la manière dont est structurée ta bdd. Bien construite, plusieurs millions de lignes ne posent aucun problème.

Mal construite, ça peut se planter à plusieurs milliers!

Dès qu'une requête met plusieurs secondes avant de retourner un résultat, il y a du travail d'optimisation en vue. (en local, sur une machine non chargée et sans affichage, il va sans dire...)