我在用户表中有以下方式记录
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
我需要获得关键字为10或20的用户。我写过这个查询:
SELECT * from User where keywords REGEXP '[[:<:]]10|20[[:>:]]'
它没有给我预期的输出。它应该过滤id 10或20并给我记录1,2,3,5的输出。记录4在这里不匹配。
为什么不起作用?有更好的方法吗?
答案 0 :(得分:2)
试试这个,
SELECT *
FROM user
WHERE FIND_IN_SET('10', keywords) > 0 OR
FIND_IN_SET('20', keywords) > 0
FIND_IN_SET是MySQL的内置函数
答案 1 :(得分:1)
重新设计您的数据库,使其实际上在1NF中,您不必处理这些令人头疼的问题,更不用说它可能带来的糟糕表现和错误
因为我知道你不会这样做,所以根本不需要使用REGEXP
,假设keywords
中的字符串实际上是一致的(如果然而,不管你是不是已经搞砸了。只需使用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,%'