|
|
|
| есть поле в котором хранится массив в сериализованном виде, например:
a:2:{i:0;a:3:{i:0;s:3:"175";i:1;s:3:"273";i:2;s:3:"272";}i:1;a:2:{i:0;s:3:"273";i:1;s:3:"272";}}
|
здесь 5 айдишников: 175,273,272,273,272. Есть ли вариант на чистом SQL их получить?
Варианты типа использовать php или нормализации не рассматриваем, иначе я бы не спрашивал) | |
|
|
|
|
|
|
|
для: Igorek
(13.06.2013 в 13:16)
| | > на чистом SQL
-это имеется ввиду просто SELECT'ом, или можно использовать процедуры и функции (тоже без возврата на клиент)
Если первое и ID всегда 5, думаю можно попробовать.
Если первое и ID может быть любое количество, то на MySQL наверно никак. На MsSQL или Oracle, думаю можно - там есть рекурсии.
Если второе, то и на MySQL можно попробовать. | |
|
|
|
|
|
|
|
для: Sfinks
(13.06.2013 в 13:38)
| | просто селектом и кол-во ID переменное... | |
|
|
|
|
|
|
|
для: Igorek
(13.06.2013 в 14:08)
| | Вообще, лично я таких вариантов не знаю.
Но если из принципа, именно только селектом....
И с огромным перерасходом ресурсов.....
И жутко медленно......
И с ограниченным верхним лимитом ID.....
И только уникальные ID (без повторов 273,272).......
Короче вот так с ограничением ID в 1 048 576:
SELECT id
FROM catalog
JOIN( SELECT a+b*4+c*16+d*64+e*256+f*1024+g*4096+h*16384+i*65536+j*262144 id FROM
(SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)a,
(SELECT 0 b UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)b,
(SELECT 0 c UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)c,
(SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)d,
(SELECT 0 e UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)e,
(SELECT 0 f UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)f,
(SELECT 0 g UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)g,
(SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)h,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)i,
(SELECT 0 j UNION SELECT 1 UNION SELECT 2 UNION SELECT 3)j
)z ON name LIKE concat('%"',id,'"%')
| =)))))))))) | |
|
|
|
|
|
|
|
для: Sfinks
(13.06.2013 в 16:27)
| | Ужас то какой))
думаю, что можно это все упростить за счет отсутствия необходимости генерировать набор чисел от 1 до 1048576, т.е. для моего примера подойдет такой вариант:
SELECT id
FROM catalog
WHERE LOCATE(CONCAT('"',id,'"'), 'a:2:{i:0;a:3:{i:0;s:3:"175";i:1;s:3:"273";i:2;s:3:"272";}i:1;a:2:{i:0;s:3:"273";i:1;s:3:"272";}}')
|
при условии, конечно, что ID в сериализованном значении существуют в catalog'е | |
|
|
|