0

次のようなシリアル化された文字列を保持するデータベースがあります。

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

このシリアル化された文字列のサブアイテムで注文するクエリを作成する方法はありますか?

4

1 に答える 1

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 という名前の 1 つの列と 0 から 9 までの値を持つ 10 行を持つ integers という名前のテーブルに依存しています。シリアル化された配列内の値の最大数)。

この整数は | を見つけるために使用されます。値を区切り、そこからキー値に続く値を抽出します。注: 各値の間に別のパイプがあると想定しています。つまり、あなたのデータは次のようになります:-

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]');

これをライブ環境で使用することはお勧めしません。パフォーマンスが急速に低下すると思われるだけでなく、正確に理解するのが簡単ではないためです

于 2013-04-09T12:48:35.670 に答える