2013-12-26 4 views
2

У меня есть база данных mysql, где несколько URL-адресов сохраняются в одном поле (см. Ниже). Теперь мне нужно отделить эти URL, чтобы вставить их в новую базу данных, где каждый URL имеет свой собственный ID/Row.Разделительные строки в запросе mysql

К сожалению, я до сих пор не смог отделить первый URL-адрес от других с помощью Substring и не смог получить следующие.

Вот пример такого поля:

www.1234.com 
www.435346.com 
www.35345567.org 
www.9380.net 
...etc. 

, так что может быть разное количество URL в поле.

я могу получить первый с:

INSERT INTO url (url) 
SELECT DISTINCT SUBSTRING_INDEX(old_url_field, 'www', 2) 
FROM old_table 

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

Спасибо за вашу помощь заранее.

EDIT:

Решение от PaparazzoKid работал с некоторыми изменениями для меня.

я просто должен был сделать некоторые изменения, так как URL, в моем случае, не отделены друг от друга пробелами, но разрывами строк [CHAR (10)], но затем она работала отлично, вы можете найти мое решение здесь

http://sqlfiddle.com/#!2/88b882/2

или кода непосредственно ниже:

CREATE TABLE tablename (
    id INT, 
    name VARCHAR(80)); 

INSERT INTO tablename VALUES 
(1, 'www.mysite.com 
www.anothersite.com 
www.siteone.com'), 
(2, 'www.sitetwo.net'); 

Мой модифицированный код SQL:

SELECT 
SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, CHAR(10), numbers.n), CHAR(10), -1) url 
FROM 
    (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
    UNION ALL SELECT 5 UNION ALL SELECT 6) numbers INNER JOIN tablename 
    ON CHAR_LENGTH(REPLACE(tablename.name,CHAR(10), ' ')) 
    -CHAR_LENGTH(tablename.name)>=numbers.n-1 
ORDER BY 
    n 
+0

Возможно, было бы проще написать небольшой скрипт для него на языке программирования. Вы можете извлечь данные из старой базы данных, обработать их и вставить в новый. – rednaw

+0

Это одноразовое усилие? или вам нужно будет продолжать это делать? – Randy

+0

Итак, вы хотите разделить его на 3 части? Может ли url быть похожим на 'foo.bar.baz.or.whatever.com'? –

ответ

2

Это может заставить вас движется в правильном направлении:

Используя эту импровизированную данные:

CREATE TABLE oldTable (
    id INT, 
    url VARCHAR(80)); 

INSERT INTO oldTable VALUES 
(1, 'www.mysite.com www.anothersite.com www.siteone.com'), 
(2, 'www.sitetwo.net'); 

CREATE TABLE newTable (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    oldID INT, 
    url VARCHAR(100)); 

Этот запрос работает:

INSERT INTO newTable (oldID, url) 
    SELECT 
     oldTable.id, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(oldTable.url, ' ', numbers.n), ' ', -1) url 
    FROM 
     (SELECT 1 n UNION ALL SELECT 2 
     UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN oldTable 
     ON CHAR_LENGTH(oldTable.url) 
     -CHAR_LENGTH(REPLACE(oldTable.url, ' ', ''))>=numbers.n-1 
    ORDER BY 
     id, n 

Результат:

SELECT * FROM newTable 

id | oldID | URL 
----|----------------------- 
1 | 1  | www.mysite.com 
2 | 1  | www.anothersite.com 
3 | 1  | www.siteone.com 
4 | 2  | www.sitetwo.net 

See the SQLFIDDLE demo here

+0

Спасибо, ваше решение сработало для меня с некоторыми изменениями. В моем случае URL-адреса не разделены Spaces, а Line Breaks [CHAR (10)], поэтому мне пришлось изменить некоторые вещи, как показано здесь: http://sqlfiddle.com/#!2/88b882/2 Я отправлю подробное решение (в случае, если кто-то еще имеет такую ​​проблему) позже, как отдельный ответ. – user3136758

+0

@ user3136758, не отправляйте его в качестве другого ответа, добавьте его в конец вашего вопроса как «рабочий пример». Изменения, внесенные вами, были недостаточно экстремальными, чтобы гарантировать новый ответ. Я думаю, что другие пользователи будут знать, как изменить скрипт для разделения разрывов строк, как и вы. Я написал этот ответ, зная, что корректировки необходимы для вашего дела. – TheCarver

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