Как обработать поле средствами SQL

general

Новичок
Как обработать поле средствами SQL

Имеем больщущюю таблицу с полями
PHP:
name
address
phone
Но в поле некоторые люди (name) имеют по нескольку телефонов и в таблицу эти телефоны были забиты в одно поле
PHP:
Иванов Иван Иванович
Москва, Сиреневый бульвар, 17
4782394,5565654,1046866
Очень нужно средствами SQL (без PHP), преобразовать такого рода записи в несколько записей. В каждой из них должен быть только один телефон, а имя и адрес - дублироваться. А именно,
PHP:
Иванов Иван Иванович
Москва, Сиреневый бульвар, 17
4782394

Иванов Иван Иванович
Москва, Сиреневый бульвар, 17
5565654

Иванов Иван Иванович
Москва, Сиреневый бульвар, 17
1046866
Ума не приложу, как может выглядеть такой запрос. Возможно ли это сделать только средствами SQL?
 

kstati

Новичок
Возможно такое решение, хотя оно мягко говоря неоптимальное, да и ручное (не один простой, либо сложный запрос, а множество):

0. Сделать резервную копию данных.

1. во временную таблицу копируются все строки,
where POSITION (',', `phoneNumber`) <> 0

2. Из первой таблицы удаляются эти же строки.

3. Из временной таблицы вставляются строки с подменой phoneNumber на
TRIM ( SUBSTRING_INDEX(`phoneNumber`, ',', 1) )
where POSITION (', ', `phoneNumber`) <> 0

4. Во временной таблице обновляются вышеуказанные строки
set `phoneNumber` = trim( RIGHT(`phoneNumber`, POSITION (',', `phoneNumber`) ) );

5. удалить из временной таблицы строки, где длинна phonNumber = 0
6. идти к пункту 3, пока временная таблица не пуста.


В общем -- активно использовать
SUBSTRING_INDEX
TRIM
POSITION
RIGHT
и временную таблицу

Во избежание таких казусов на будущее можно использовать в качестве типа поля `phoneNumber` пятибайтный целочисленный беззнаковый тип.

И экономия, и ограничение.

/me Хотя в данном примере странно говорить про экономию ресурсов, когда и ключа-то толком нет -- им является связка двух полей фио-адрес, и то с натяжкой.

P.S. В таких задачах и понимается, что отсутствие функций в Mysql - это огромный минус.
Иначе можно было бы написать одну "заводящую работу" фунцию и одну рекруссивную, выполняющую её. да закинуть работу в транзакцию...
 

fixxxer

К.О.
Партнер клуба
P.S. В таких задачах и понимается, что отсутствие функций в Mysql - это огромный минус.
Иначе можно было бы написать одну "заводящую работу" фунцию и одну рекруссивную, выполняющую её. да закинуть работу в транзакцию..
правда чтоли

http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html
 

kstati

Новичок
fixxxer
Воистину неправда .
Забылся -- у моего хостера до сих пор 4. ;(
в пятой версии можно решить проблему автоматом - написав пару функций.
 
Сверху