2014-10-14 2 views
-3

Как получить идентификатор из этих строк массива?MYSQL Split Array Строки с разной длиной

Например:

a:5:{i:0;i:47464;i:1;i:47571;i:2;i:47572;i:3;i:47693;i:4;i:47694;} 
a:8:{i:0;i:48584;i:1;i:49521;i:2;i:49542;i:3;i:49799;i:4;i:49967;i:5;i:50127;i:6;i:50268;i:7;i:50270;} 
a:3:{i:0;i:38752;i:1;i:38753;i:2;i:38892;} 

расколоть как сингл идентификаторам:

id  
------ 
47464 
47571 
47572 
47693  
47694 
48584 
49521 
... 
... 
+1

О мальчик .. Это данные из реальной базы данных? – Alternatex

+0

Все эти данные объединены в одну колонку? –

+0

мать встроенных данных ... это все, что строка? в одной колонке? –

ответ

0

один способ сделать это (при условии, что все идентификаторы больше, чем 100, и вы не имеете более чем 100 в одном ряду если вы просто изменяете предложение HAVING соответственно) составляет временную таблицу цифр, которая содержит 1-999, а затем присоединяется к этой таблице ... если у вас более 1000 в одной строке идентификатора, тогда у вас есть другие проблемы для решения ,

CREATE TEMPORARY TABLE digits AS 
SELECT 
    SEQ.SeqValue 
FROM 
( SELECT (HUNDREDS.SeqValue + TENS.SeqValue + ONES.SeqValue) SeqValue 
    FROM(SELECT 0 SeqValue UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ONES 
    CROSS JOIN(SELECT 0 SeqValue UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) TENS 
    CROSS JOIN(SELECT 0 SeqValue UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900) HUNDREDS 
) SEQ 

после создания таблицы цифры использовать этот запрос, чтобы очистить случайный материал

SELECT 
    REPLACE(REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(huge_str, 'i:', n.digit+1), 'i:', -1), ';', ''), '}', '') cleaned_str 
FROM (SELECT SUBSTRING(huge_str, 6) AS huge_str FROM mashed_shit) t 
JOIN(SELECT seqvalue AS digit FROM digits) n 
    ON LENGTH(REPLACE(huge_str, 'i:' , '')) <= LENGTH(huge_str)-n.digit 
GROUP BY cleaned_str 
HAVING cleaned_str >= 10 
ORDER BY n.digit 
+0

Спасибо, я завтра проведу ваше решение – gumbleliks

+0

@gumbleliks я уже протестировал его, и его работа вывела бы демонстрационную версию, но sqlfiddle не работает прямо сейчас :( –

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