2016-02-24 4 views
0

j'ai enregistrements dans la table d'utilisateur manière suivanteMYSQL correspondance des mots-clés csv colonne

id name  address keywords 
1  thompsan paris  10,20,30 
2  samson paris  10,20,30 
3  Nilawa paris  10,20,30 
4  Nalama paris  100,30,50 
5  Nalama paris  100,300,20 

je besoin pour les utilisateurs qui ont les mots-clés de 10 ou 20. J'ai écrit cette requête:

SELECT * from User where keywords REGEXP '[[:<:]]10|20[[:>:]]' 

Cela ne me donne pas la sortie attendue. Il devrait filtrer pour l'identifiant 10 ou 20 et me donner la sortie de l'enregistrement 1,2,3,5. l'enregistrement 4 ne correspond pas ici.

Pourquoi cela ne fonctionne-t-il pas? Y a-t-il une meilleure manière de faire cela?

Répondre

2

Essayez ceci,

SELECT * 
FROM user 
WHERE FIND_IN_SET('10', keywords) > 0 OR 
     FIND_IN_SET('20', keywords) > 0 

FIND_IN_SET est une fonction builtin avec MySQL

+0

Est-il possible d'ajouter un ensemble de chaînes au premier paramètre sans ajouter de chaîne? par exemple, FIND_IN_SET ('10, 20 ', mots-clés) – dev1234

1

Refonte votre base de données afin qu'il soit réellement 1NF et vous ne serez pas à faire face à ces maux de tête sans parler de l'horrible les performances et les bugs qu'il est destiné à vous faire descendre la ligne. Comme je sais que vous ne le ferez pas, il n'est pas nécessaire d'utiliser REGEXP du tout, en supposant que votre chaîne en keywords est effectivement cohérente (et si ce n'est pas le cas, vous êtes vissé de toute façon). Il suffit d'utiliser LIKE:

SELECT -- We'll list out the columns, since we NEVER use SELECT * 
    id, 
    name, 
    address, 
    keywords 
FROM 
    User 
WHERE 
    ',' + keywords + ',' LIKE '%,10,%' OR 
    ',' + keywords + ',' LIKE '%,20,%' 
+0

J'ai essayé ceci et n'ai obtenu aucune sortie. SELECT * FROM Utilisateur WHERE ',' + mots clés + ',' LIKE '%, 80,%' – dev1234