2013-09-22 2 views
1

У меня проблема, которую нужно решить ... У меня есть таблица, в которой одно из полей сериализовано (поле: s_field). Это всего лишь массив идентификаторов. Но теперь мне нужно получить все записи данных WHERE s_field = 5 .. Итак, у меня есть записи, где s_field равно serialized(array(4, 5, 6));, и есть тонны этих записей ... так как я могу получить - используя sql - все записи, в которых один из Идентификаторы s_field - id == 5;SQL WHERE, если поле сериализовано

Надеюсь, вы понимаете, что я имею в виду

И я не думаю, что получить все записи, и каждый из них десериализируются и чек не самое лучшее, что нужно сделать, потому что многие из них

+0

Можно ли изменить существующую функциональность? Вы бы лучше сохранили эти значения в отдельной таблице. – Jeemusu

ответ

1

Вы можете попробовать добавить атрибут zerofill в поле ID, так что вы будете иметь, скажем, 0000005, а не 5, а затем с помощью LIKE, чтобы соответствовать для 0000005

+0

ok Я попробую .. – user2779986

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,%' 

Однако лучшим решением было бы неэтериализовать все эти данные и поместить их в реляционные таблицы.

EDIT: Как указано в @kyra, это не будет работать для первого и последнего элемента массива.

Так что, если вы не получите никакого результата с первым запросом вы могли бы попробовать:

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

И, наконец:

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

Если у вас есть в основном поля только с одним элементом, вы должны начать с второй запрос.

EDIT:

Конечно, если сериализованные данные на самом деле выглядит следующим образом: 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 и последние предметы.

+2

Это не будет работать для первого и последнего элемента массива. – Mina

+0

Также 'serialized' версия' array (4, 5, 6) 'is' a: 3: {i: 0; i: 4; i: 1; i: 5; i: 2; i: 6;} % ' – Mina

+0

Это не то, что сказал ОП, я думаю, он показал нам, что на самом деле находится в его столе. –

Смежные вопросы