Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT comma separated list in the field / 3 сообщений из 3, страница 1 из 1
14.03.2015, 22:30:54
    #38905005
Sergey Borulko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT comma separated list in the field
Здравствуйте, есть например вот такая таблица.

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `example` (
  `local_id` int(11) unsigned NOT NULL DEFAULT '0',
  `foreign_id` int(11) unsigned NOT NULL DEFAULT '0'
)
 



Есть данные, такого формата
Код: xml
1.
2.
5   -> 10, 20, 30
23  -> 40, 5



Существуют ли какие-либо функции для получения следующего результата(без использования процедур, курсоров и т.п.):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-------------------------
| local_id | foreign_id |
-------------------------
|     5    |      10    |
-------------------------
|     5    |      20    |
-------------------------
|     5    |      30    |
-------------------------     
|    23    |      40    |
-------------------------   
|    23    |       5    |
-------------------------
...
Рейтинг: 0 / 0
15.03.2015, 00:07:11
    #38905023
anvano
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT comma separated list in the field
С просторов интернета:

Если взять вашу таблицу example которая имеет вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
---------------------------
| local_id | foreign_id   |
---------------------------
|     5    |  10, 20, 30  |
---------------------------
|    23    |  40, 5       |
---------------------------



То вот этот селект разворачивает ее в требуемый вид:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.local_id,SUBSTRING_INDEX(SUBSTRING_INDEX(t.foreign_id, ',', n.n), ',', -1) value
  FROM example t CROSS JOIN 
(
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS N 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) a
   ,(SELECT 0 AS N 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) b
    ORDER BY n
) n
 WHERE n.n <= 1 + (LENGTH(t.foreign_id) - LENGTH(REPLACE(t.foreign_id, ',', '')))
 ORDER BY t.local_id



Результат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-------------------------
| local_id | foreign_id |
-------------------------
|     5    |      10    |
-------------------------
|     5    |      20    |
-------------------------
|     5    |      30    |
-------------------------     
|    23    |      40    |
-------------------------   
|    23    |       5    |
-------------------------




Вложенный селект тупо генерит таблицу из 100 последовательных целых.
Если требуется производительность - можно заранее сделать отдельную табличку для него, а не генерить на лету.
...
Рейтинг: 0 / 0
15.03.2015, 01:30:34
    #38905042
Sergey Borulko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT comma separated list in the field
anvano, Спасибо большое Вам, помогло.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT comma separated list in the field / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]