如果字段是序列化的SQL WHERE

时间:2013-09-22 09:04:24

标签: php mysql sql codeigniter

我有一个需要解决的问题...... 我有一个表,其中一个字段是序列化的(字段:s_field)。 它只是一个id的数组。 但是现在我需要获取所有数据条目WHERE s_field = 5 .. 所以我有条目,其中s_field是serialized(array(4, 5, 6));并且有大量这些条目...所以我如何得到 - 使用sql - 所有条目,其中一个s_field id是id == 5;

希望你明白我的意思

我不认为获取所有条目并且每个条目都反序列化并且检查不是最好的事情,因为它们有很多

2 个答案:

答案 0 :(得分:1)

您可以尝试将zerofill属性添加到ID字段,这样您就可以使用0000005而不是5,然后使用LIKE来匹配for { {1}}

答案 1 :(得分:0)

假设您的参赛作品看起来像serialized(array(4, 5, 6));,您可以使用此查询找到“5”:

a:3:{i:0; i:4; i:1; i:5; i:2; i:6;}

SELECT some_field WHERE s_field LIKE '%, 5,%'

然而,更好的解决方案是将所有数据反序列化并将其放在关系表中。

修改 正如@kyra指出的那样,这不适用于数组的第一个和最后一个项目。

因此,如果第一个查询没有结果,则可以尝试:

SELECT some_field WHERE s_field LIKE '%(5,%'

最后:

SELECT some_field WHERE s_field LIKE '%, 5)%'

如果您的主要字段只有一个元素,则应从第二个查询开始。

修改

当然,如果序列化数据实际上如下所示:a:3:{i:0;i:4;i:1;i:5;i:2;i:6;}您可以像这样找到'5':

SELECT some_field WHERE s_field LIKE '%i:5;%'

这样它甚至可以用于fisrt和最后的项目。