[MySql) Faire un where sur un champs liste de valeurs

[MySql) Faire un where sur un champs liste de valeurs - SQL/NoSQL - Programmation

Marsh Posté le 03-11-2006 à 10:26:45    

Bonjour à tous,
J'ai une petite question concernant une requête qui doit faire un WHERE sur un champ dont la valeur est une LISTE de valeurs.
 
Voici grosso modo ma table :
TOPIC
TOPIC_ID(integer)
TOPIC_COUNTRIES(VARCHAR2)
 
Le type de valeurs dans TOPIC_COUNTRIES est une liste d'entiers séparés par une virgule : 25,36,95,23,59
 
La requête que je souhaite faire doit me permetre de sélection les enregistrements dont le TOPIC_COUNTRIES contient 95 par exemple.
Une recherche simple du style WHERE TOPIC_COUNTRIES LIKE '%95%' fonctionne... mais c'est un peu bourrin.
 
Y a plus simple ?
Pour info je tourne sous mysql

Reply

Marsh Posté le 03-11-2006 à 10:26:45   

Reply

Marsh Posté le 03-11-2006 à 10:34:40    

De toute façon à part faire des like gérant tous les cas ou des charindex, bref des opérations sur des chaines je ne vois pas bien ce que tu peux faire.
 
Ce qui est curieux c'est la table, pourquoi avoir stocké des entiers séparés par des virgules ? N'aurait-il pas été plus simple et plus avisé de stocker tous les couples topic_id / country_id ?

Reply

Marsh Posté le 03-11-2006 à 10:39:58    

en fait c'est un peu plus compliqué que cela :-(
 
La table contient en fait des infos de type news, auxquelles des users peuvent s'abonner.
Donc pour ne pas avoir une table avec x fois la même news associée a un utilisateurs unique, j'ai mis pour chaque news la liste des id des users qui ont souscrits à cette news.
 
Je sais pas si je suis bien clair  :pt1cable:

Reply

Marsh Posté le 03-11-2006 à 10:42:11    

Je ne suis pas certain de bien saisir mais je serais curieux de voir ton modèle... :)

Reply

Marsh Posté le 03-11-2006 à 10:45:39    

comment je peux te fournir ça ? j'ai rien écris :(

Reply

Marsh Posté le 03-11-2006 à 10:56:17    

Vu comme ça, j'ai l'impression que tu as un problème de conception (je peux bien sûr me tromper).
 
Mais tu n'as peut-être pas l'intention de modifier ton modèle, et pour en revenir à ta question initiale en l'état tu es obligé de travailler sur la chaine TOPIC_COUNTRIES, que ce soit avec like ou autre...
 

Reply

Marsh Posté le 03-11-2006 à 11:01:00    

le soucis c'est que par exemple je recherche le ID 15, et que dans la liste il trouve 150... il va dire que c'est le meme :-(

Reply

Marsh Posté le 03-11-2006 à 11:31:46    

d'où le problème de conception :D
 
edit : fait voir ton modèle, explique vite fait la partie que tu évoques si tu n'as rien sous la main
 
au pire si tu ne veux rien changer stocke systématiquement le séparateur avant et après chaque valeur
ex : ",15," ou ",21,15,150," et comme ça si tu recherche ta valeur entre parenthèse tu la trouveras toujours


Message édité par pikti le 04-11-2006 à 09:47:16
Reply

Marsh Posté le 03-11-2006 à 15:08:32    

Normalement tu serait pas suposé avoir 2 tables, plus un ensemble de lien (Liaison many/many)??? :
TOPIC
TOPIC_ID(integer)
.....
....  
 
--------------------
COUNTRIES
COUNTRIES_ID(integer)
COUNTRIES_NON(VAR_CHAR)
.....
--------------
LIEN seulement 2 champs
TOPIC_ID(integer)
COUNTRIES_ID(integer)
 
Bon alors comme ceci, pas de donner en double dans Countries, pas de donné en douple dans Topic, et une table de lien qui te permet de faire tes recherche ....
 
select t.TOPIC_ID from topic t, countries c, lien l  
where c.countries_desc = 95 and c.countries_id = l.countries_id and t.topic_id = l.topic_id

Reply

Marsh Posté le 04-11-2006 à 12:25:09    

Désolé de pas avoir répondu hier, j'étais plongé dans mon code :-p
Effectivement j'étais mal parti...j'en oublie les règles de base n'importe koi lol
 
Au final j'ai effectivement créé une table intermédiaire que me fait le lien dans les autres autres, donc le soucis est résolu et même simplifié :)
 
Merci pour votre aide !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed