Как разбить значение записи на несколько строк с помощью MySQL?

У меня есть такая таблица:

// mytable
+----+--------+-------------------+
| id |  word  |      numbers      |
+----+--------+-------------------+
| 1  | hello  | 1<br>2<br>3<br>   |
| 2  | how    | 12<br>15<br>      |
| 3  | are    | 453<br>1<br>      |
| 4  | you    | 3<br>33<br>453<br>|
+----+--------+-------------------+

И мне нужен этот вывод:

// mynewtable
+----+--------+---------+
| id |  word  | numbers |
+----+--------+---------+
| 1  | hello  | 1       |
| 2  | hello  | 2       |
| 3  | hello  | 3       |
| 4  | how    | 12      |
| 5  | how    | 15      | 
| 6  | are    | 453     |
| 7  | are    | 1       |
| 8  | you    | 3       |
| 9  | you    | 33      |
| 10 | you    | 453     |
+----+--------+---------+

Я могу сделать это с помощью PHP. Сначала я должен получить все строки и взорвать их на <br>, а затем снова вставить. Но теперь я хочу знать, есть ли лучшее решение? (особенно при использовании чистого MySQL)


person Shafizadeh    schedule 02.12.2015    source источник
comment
Возможно, сейчас самое подходящее время для рефакторинга довольно плохо спроектированной части вашей базы данных.   -  person RiggsFolly    schedule 02.12.2015
comment
Если вы можете заменить <br> одним символом, то Могу ли я решить эту проблему с помощью чистого mysql? присоединение к ';' разделенные значения в столбце может быть интересно. Вы можете изменить функции, чтобы использовать <br> в качестве разделителя. Это даст желаемый результат.   -  person Ryan Vincent    schedule 02.12.2015
comment
Что сказал @RiggsFolly - пора рефакторить и исправлять вещи. Тот, кто разработал первую модель, понятия не имел, как используются базы данных. Вы можете либо взломать и попытаться заставить его работать, сталкиваясь с многочисленными проблемами по пути, либо вы можете просто создать таблицу, в которой хранится информация, как вы показали в примере вывода. Удачи, я надеюсь, что вы решите сделать это правильно, потому что это будет наименьший объем работы.   -  person Mjh    schedule 02.12.2015
comment
Я согласен с @Mjh. Хотя Райан Винсент указывает вам правильное направление с точки зрения выбора/корректировки данных в запросе, следующая проблема, с которой вы столкнетесь, — превратить выбранные данные в INSERT запрос. Просто он очень быстро станет очень сложным и запутанным.   -  person Byson    schedule 02.12.2015
comment
Просто чтобы было понятно. Я всегда использую нормализованные таблицы. Единственная причина, по которой я дал этот ответ, заключалась в том, чтобы найти какой-то «стандартный способ» справиться с этими «надоедливыми» foreign keys in delimited strings. Функции являются компаньонами FIND_IN_SET ;-/   -  person Ryan Vincent    schedule 02.12.2015
comment
Есть и другие решения. Они не лучше.   -  person Strawberry    schedule 02.12.2015
comment
@Strawberry Я думаю, что ответ Simhachalam Gulla может подойти. (это под моим вопросом)   -  person Shafizadeh    schedule 02.12.2015


Ответы (2)


Попробуйте это решение через запрос

SELECT @row := @row + 1 as row, t.word, t.number FROM (
    SELECT
      word,
      SUBSTRING_INDEX(SUBSTRING_INDEX(numbers, '<br>', n.digit+1), '<br>', -1) number
    FROM split_rec
    INNER JOIN 
        (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n
        ON LENGTH(REPLACE(numbers, '<br>' , '')) <= LENGTH(numbers)-n.digit
    ORDER BY id, n.digit
) AS t, (SELECT @row := 0) r 
WHERE t.number <> ''

Выход

row word    number
1   hello   1
2   hello   2
3   hello   3
4   how     12
5   how     15
6   are     453
7   are     1
8   you     3
9   you     33
10  you     453
person Simhachalam Gulla    schedule 02.12.2015

Хотя я думаю, что это возможно с использованием хранимых процедур, переменных MySQL и свободного использования LIKE "%...%"statements, это было бы на порядок сложнее, чем решение PHP.

Кроме того, я думаю, что это вообще невозможно, если у вас нет доступа к хранимым процедурам, поскольку вам нужно будет динамически создавать новые операторы INSERT на основе того, что вы найдете в этом последнем столбце.

TL;DR: Нет, сделайте себя счастливым и используйте PHP.

person Byson    schedule 02.12.2015