1

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

希望你明白我的意思

而且我认为获取所有条目并对其进行反序列化和检查并不是最好的事情,因为它们有很多

4

2 回答 2

1

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

于 2013-09-22T09:50:18.087 回答
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;%'

这样,它甚至应该适用于第一个和最后一个项目。

于 2013-09-22T09:41:37.953 回答