Mysql : select d'une valeur dans un champs en contenant plusieurs

  • Auteur de la discussion Auteur de la discussion Recif
  • Date de début Date de début
WRInaute impliqué
Bonjour,

Je ne trouve pas le moyen faire une requête d'une valeur dans un champs en contenant plusieurs. Je m'explique :

le champs MySQL (on l'appellera "field") d'un enregistrement contient les nombres "1,5,6,8,9,13"
Comme je fais pour faire un select en charchant 1 nombre présent dedans (par exemple je cherche tous les enregsitrements contenant le nombre "8" dans le champs "field"... :(

Merci
 
WRInaute discret
Bonjour,
A prioris cela semble possible avec l'opérateur "like" :
Code:
SELECT * FROM tatable where field LIKE '%8%'

Et '8' pourrait être remplacé par une variable $variable balancée via POST ou GET.
 
WRInaute impliqué
Bonjour Lepadre,

Nan, marche pas car le champs est du type "1,5,9,8,14" donc de type text ou varchar et il y a des virgules entre chaque nombre... Donc si on prends un exemple :

je cherche le nombre 4
Je fais un like '%4%'
Le résultat me sorts l'enregistrement contenant "1,5,9,8,14" puisqu'il a détecté le 4 du 14... Mais ce n'est pas juste... car c'est 14 et pas 4... :(
 
WRInaute accro
A ma connaissance, tu ne pourras pas.
Au mieux tu pourras faire
Code:
SELECT * FROM table WHERE champ LIKE "%8%"
Ca te donnera tous les champs qui contiennent "8", c'est à dire "8", "18", "28", "80", "88", "83", etc ...
[edit : grilled]
Fallait pas faire ta base comme ça ... ce que tu peux faire est une table liée qui elle contiendra les différentes valeurs que tu voulais attribuer à ce champ :

Id idChamp valeur
1 18 1
2 18 2
3 18 3
4 19 1
5 19 3

etc ...
après avec une requete différente tu peux regrouper le tout et obtenir ce que tu veux comme résultat.
 
WRInaute passionné
Salut,

Il me semble que l'on peut également utiliser "REGEXP" pour déterminer les limites d'un mot ..à confirmer !
Code:
$requete = 8;
$query = mysql_query("SELECT field FROM MATABLE WHERE field REGEXP '[[:<:]]".$requete."[[:>:]]' ") or die (mysql_error());
 
WRInaute discret
Recif a dit:
Bonjour Lepadre,

Nan, marche pas car le champs est du type "1,5,9,8,14" donc de type text ou varchar et il y a des virgules entre chaque nombre... Donc si on prends un exemple :

je cherche le nombre 4
Je fais un like '%4%'
Le résultat me sorts l'enregistrement contenant "1,5,9,8,14" puisqu'il a détecté le 4 du 14... Mais ce n'est pas juste... car c'est 14 et pas 4... :(

Oui exact puisqu'on demande toutes les entrées dont le champ fiel contient 'quelquechoseourien4quelquechoseourien'

Et si tu fais :
Code:
SELECT * FROM tatable where field LIKE ',4'
OU
Code:
SELECT * FROM tatable where field LIKE '%,4,%'
 
WRInaute impliqué
lepadre a dit:
Oui exact puisqu'on demande toutes les entrées dont le champ fiel contient 'quelquechoseourien4quelquechoseourien'

Et si tu fais :
Code:
SELECT * FROM tatable where field LIKE ',4'
OU
Code:
SELECT * FROM tatable where field LIKE '%,4,%'

Marche pas non plus : si le champs ne contient qu'un seul nombre, donc pas de virgule... :?
 
WRInaute impliqué
nickargall a dit:
A ma connaissance, tu ne pourras pas.
Au mieux tu pourras faire
Code:
SELECT * FROM table WHERE champ LIKE "%8%"
Ca te donnera tous les champs qui contiennent "8", c'est à dire "8", "18", "28", "80", "88", "83", etc ...
[edit : grilled]
Fallait pas faire ta base comme ça ... ce que tu peux faire est une table liée qui elle contiendra les différentes valeurs que tu voulais attribuer à ce champ :

Id idChamp valeur
1 18 1
2 18 2
3 18 3
4 19 1
5 19 3

etc ...
après avec une requete différente tu peux regrouper le tout et obtenir ce que tu veux comme résultat.

Oui, j'y ai pensé mais sa démultiplie le nombre d'enregistrements, je vais avoir une table énorme... :(
Mais bon, si j'ai pas le choix... C'est juste un problème pour le script de recherche...
 
WRInaute discret
Code:
SELECT * FROM tatable where field LIKE '%,4,%' OR field LIKE '4,%' OR field LIKE '%,4' OR field ='4'

Donc je veux toutes ces satanées entrées dont le champ field commence par '4,qqchose' OU contient 'qqchose,4,qqchose' ; OU termine par 'qqchose,4' OU est strictement égal à 4....
 
WRInaute impliqué
Ouïe! Sur des dizaines de milliers d'enregistrements ça va faire mal en terme de pef et de ressource serveur! :(
Bon ben je vais me tourner vers la table supplémentaire, je crois que c'est mieux...
 
WRInaute discret
j'arrive p-e un peu tard, mais si tu ajoute systématiquement une virgule en début et fin du champ (ex: ,1,2,4,14, ou ,4,) tu peux faire un like '%,4,%' comme ça une seul like suffit (surtout pas de OR), pas de nouvelle table à créer et ça fonctionne assez bien je pense
 
WRInaute discret
Sullyvan a dit:
j'arrive p-e un peu tard, mais si tu ajoute systématiquement une virgule en début et fin du champ (ex: ,1,2,4,14, ou ,4,) tu peux faire un like '%,4,%' comme ça une seul like suffit (surtout pas de OR), pas de nouvelle table à créer et ça fonctionne assez bien je pense

Non, car si j'ai bien compris le 4 peut se trouver en début ou en fin du champ ou encore tout seul sans virgules donc soit un select conditionnel ou créer un nouveau champ, plus judicieux au final.
 
WRInaute impliqué
Merci, j'ai finalement opté pour la table supplémentaire... :wink:
Par contre j'ai encore un souci logique à vous soumettre... :mrgreen:

Je veux pouvoir faire une sélection entre deux mois de l'année. J'ai des enregistrements de ce type:

------------------------
|nom|mois1|mois2|
------------------------
|toto| 12 | 3 |
------------------------
|bob| 3 | 9 |
------------------------

Un moteur de recherche permet de trouver les noms entre le mois1 et le mois2 (les chiffres correspondant aux mois de l'année)
Tout va bien lorsque le mois 1 est inférieur en nombre au mois deux (du style février à juin, donc 2 à 6), par contre le problème intervient lorsque je veux sélectionner entre décembre et mai par exemple, donc entre 12 et 5... Là ca colle pas...

Dans le moteur de recherche on entre un mois, dans le resultat on séllectionne tous les enregistrements dont la plage intègre ce dernier.
Donc dans la pratique dans le script je fais :

WHERE mois1<='$now' and mois2>='$now'

voilà le problème... :-( une idée?
 
WRInaute impliqué
bon, j'ai trouvé ça :

where (mois1<='$now' and mois2>='$now') OR (mois1>='$now' and mois2>='$now')

Ca a l'air de fonctionner... Ca vous parait sans faille?... :?:
 
Nouveau WRInaute
Essaye ça :

Code:
WHERE (mois1<=mois2 AND '$now'>=mois1 AND '$now'<=mois2) OR (mois1>mois2 AND (mois1>='$now' OR mois2<='$now'))
 
WRInaute impliqué
Marche pas... :(

exemple ne marchant pas :
mois choisi ($now) = 7
mois1 = 11
mois2 = 6

NE devrait retourner aucun enregistrement, mais est accepté par

WHERE (mois1<=mois2 AND '$now'>=mois1 AND '$now'<=mois2) OR (mois1>mois2 AND (mois1>='$now' OR mois2<='$now'))
 
Nouveau WRInaute
Je suis allé trop vite^^

Code:
WHERE (mois1<=mois2 AND '$now'>=mois1 AND '$now'<=mois2) OR (mois1>mois2 AND ('$now'>=mois1 OR '$now'<=mois2))
 
WRInaute impliqué
J'ai trouvé! (enfin je crois)

Code:
WHERE ((mois1>mois2 AND '$now'>=mois1 AND '$now'>=mois2) OR (mois1>mois2 AND '$now'<=mois1 AND '$now'<=mois2)) OR (mois1<mois2 AND mois1<='$now' AND mois2>='$now')
 
WRInaute impliqué
J'ai pas testé la tienne, mais j'ai essayé avec pas mal de combinaisons et ca a l'aire de coller!
C'est tout de même grâce à toi car je ne savais pas qu'on pouvait comparer des champs de la table dans une requête :oops:

Merci! 8)
 
Discussions similaires
Haut