我有一个表格,每行都有一个单元格,里面有几个逗号分隔的值,比如TAGS=1,2,3,4,5
. 如何选择包含例如 TAG 5 的所有行?
我已经尝试过,但是如果=2 例如,SELECT * FROM videos WHERE tags LIKE %$id%
我会遇到问题,因为 12 或 22 也被选中...$id
请问有什么想法吗?
我有一个表格,每行都有一个单元格,里面有几个逗号分隔的值,比如TAGS=1,2,3,4,5
. 如何选择包含例如 TAG 5 的所有行?
我已经尝试过,但是如果=2 例如,SELECT * FROM videos WHERE tags LIKE %$id%
我会遇到问题,因为 12 或 22 也被选中...$id
请问有什么想法吗?
哦,我很久以前就这样做了——当我认为自己是如何解决问题的天才时,这是我一生中最大的错误。您会看到,“Like”是一个非常昂贵的比较运算符,需要一段时间才能查找任何内容,尤其是在您将百分比放入其中的那一刻。
您最好创建一个单独的表,将不同的 id 链接到每一行,查找速度会快得多。
但是,您想解决上述问题。我建议更新您的专栏以在开头或结尾使用逗号,然后搜索在它之前或之后有逗号的任何内容。
例如
LIKE '%,12,%'
您希望将where
语句设置为:
where concat(',', tags, ',') like concat('%,', 5, ',%')
在您的情况下,这将是:
where concat(',', tags, ',') like concat('%,', $id, ',%')
也就是说,您要确保分隔符围绕您要查找的值。因此,右手边被评估为'%,5,%'
。然后,您需要确保列表的每个元素都被分隔符包围,包括第一个和最后一个元素。
使用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