我有一个表,每行上都有一个单元格,其中包含几个以逗号分隔的值,如TAGS=1,2,3,4,5
。如何选择包含例如TAG 5的所有行?
我尝试了SELECT * FROM videos WHERE tags LIKE %$id%
,但是如果$id
= 2,我会遇到问题,因为12或22也会被选中...
有什么想法吗?
答案 0 :(得分:1)
哦,我很久以前就这么做过 - 这是我生命中最大的错误,当时我认为自己是一个如何攻击问题的天才。你看,“Like”是一个非常昂贵的比较运算符,需要一段时间才能查找,特别是你把百分比放在那里的那一刻。
你最好创建一个单独的表,将不同的id链接到每一行,查找的速度会快得多。
但是,您想要解决上述问题。我建议更新您的列以在开头或结尾处使用逗号,然后搜索在其之前或之后有逗号的任何内容。
e.g。
LIKE '%,12,%'
答案 1 :(得分:1)
您希望将where
语句设置为:
where concat(',', tags, ',') like concat('%,', 5, ',%')
在您的情况下,这将是:
where concat(',', tags, ',') like concat('%,', $id, ',%')
也就是说,您希望确保分隔符与您要查找的值相近。因此,右侧评估为'%,5,%'
。然后,您需要确保列表的每个元素都被分隔符包围,包括第一个和最后一个元素。
答案 2 :(得分:1)
使用FIND_IN_SET()
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
select * from videos where FIND_IN_SET('22',tags)>0;
http://sqlfiddle.com/#!2/5a699/1