选择在逗号分隔的单元格中找到变量的行

时间:2013-03-03 22:04:30

标签: mysql

我有一个表,每行上都有一个单元格,其中包含几个以逗号分隔的值,如TAGS=1,2,3,4,5。如何选择包含例如TAG 5的所有行?

我尝试了SELECT * FROM videos WHERE tags LIKE %$id%,但是如果$id = 2,我会遇到问题,因为12或22也会被选中...

有什么想法吗?

3 个答案:

答案 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