SQL WHERE if 字段已序列化


SQL WHERE if field is serialized

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

希望你明白我的意思

而且我不认为获取所有条目以及每个条目进行反序列化和检查不是最好的选择,因为有很多条目

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

假设您的条目确实看起来像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;%'

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