2013-04-09 196 views
0

值我有保存一个序列化字符串这样的数据库:订单在连续字符串

[gundealer|0 
mayor|0 
umlf|0 
sbgfboss|0 
ems|0 
trader|0 
thief|0 
cp|0 
umflboss|0 
guard|0 
sbgf|0 
] 

是否有可能的方式进行查询由该序列化的字符串的一个子项订购?

+0

这是可能的(并且我已经完成了一个存储在MySQL字段中的php序列化数组),但可能表现不佳。 – Kickstart 2013-04-09 12:19:45

+0

在php中抓取66k记录并对其进行排序将是一件难事。这就是为什么我问。如果在查询中可能会为我节省很多时间 – 2013-04-09 12:21:37

回答

1

她,你去同一个演示的方式做到这一点: -

SELECT SerializeTest.* 
FROM SerializeTest 
INNER JOIN (SELECT SerializeTest.Id, SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(SomeField, 2, LENGTH(SomeField) -2) , '|', anInt +1) , '|', -1) AS SortValue 
FROM SerializeTest, 
(SELECT a.i+b.i*10 AS anInt FROM integers a, integers b) Sub1 
WHERE MOD(anInt, 2) =1 
AND anInt <= (LENGTH(SomeField) - LENGTH(REPLACE(SomeField,'|', ''))) 
AND SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(SomeField,2, LENGTH(SomeField) -2), '|', anInt), '|', -1) = 'ems') Sub2 
ON SerializeTest.Id = Sub2.Id 
ORDER BY SortValue 

这依赖于一个表中调用整数一个名为i和10行从0值到9单列这是对加盟本身来获得一个整数范围(你可以很容易地扩展这部分以获得更大范围的数字,取决于序列化数组中的最大值)。

此整数用于查找|限定值的值,并从中提取关键值后面的值。注意我假定每个值之间都有另一个管道。也就是说,你的数据会是这样的: -

INSERT INTO `SerializeTest` (`Id`, `SomeField`) VALUES 
(1, '[gundealer|1|mayor|0|umlf|3|sbgfboss|0|ems|5|trader|0|thief|0|cp|0|umflboss|0|guard|0|sbgf|0]'), 
(2, '[gundealer|1|mayor|0|umlf|3|sbgfboss|0|ems|9|trader|0|thief|0|cp|0|umflboss|0|guard|0|sbgf|0]'), 
(3, '[gundealer|1|mayor|0|umlf|3|sbgfboss|0|ems|8|trader|0|thief|0|cp|0|umflboss|0|guard|0|sbgf|0]'); 

请注意,我真的不会建议你在现场环境中使用它。不仅因为我怀疑性能会迅速下降,还因为它不是很容易理解

+0

是的,你是对的,如果我正确地阅读它,我不能将它应用于我的情况。该字段不包含这些设置值。它依赖于用户和用户。我更愿意通过PHP解析订单。 – 2013-04-09 13:07:46

+0

你可能仍然可以使用它。用于获取排序值的子查询可以重复排序多个字段,并且可以使用LEFT OUTER JOIN来处理行中没有您想要排序的值之一的情况。但是,将这些值拆分到单独的表格通常会更好。 – Kickstart 2013-04-09 13:11:39