0

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

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

请问有什么想法吗?

4

3 回答 3

1

哦,我很久以前就这样做了——当我认为自己是如何解决问题的天才时,这是我一生中最大的错误。您会看到,“Like”是一个非常昂贵的比较运算符,需要一段时间才能查找任何内容,尤其是在您将百分比放入其中的那一刻。

您最好创建一个单独的表,将不同的 id 链接到每一行,查找速度会快得多。

但是,您想解决上述问题。我建议更新您的专栏以在开头或结尾使用逗号,然后搜索在它之前或之后有逗号的任何内容。

例如

LIKE '%,12,%'
于 2013-03-03T22:08:01.860 回答
1

您希望将where语句设置为:

where concat(',', tags, ',') like concat('%,', 5, ',%')

在您的情况下,这将是:

where concat(',', tags, ',') like concat('%,', $id, ',%')

也就是说,您要确保分隔符围绕您要查找的值。因此,右手边被评估为'%,5,%'。然后,您需要确保列表的每个元素都被分隔符包围,包括第一个和最后一个元素。

于 2013-03-03T22:13:41.293 回答
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

于 2013-03-03T22:20:29.257 回答