MySQL: разделенный запятыми список в несколько строк
У меня есть ненормализованная таблица со столбцом, содержащим список, разделенный запятыми, который является внешним ключом для другой таблицы:
+----------+-------------+ +--------------+-------+
| part_id | material | | material_id | name |
+----------+-------------+ +--------------+-------+
| 339 | 1.2mm;1.6mm | | 1 | 1.2mm |
| 970 | 1.6mm | | 2 | 1.6mm |
+----------+-------------+ +--------------+-------+
Я хочу прочитать эти данные в поисковой системе, которая не предлагает процедурного языка.
Итак, существует ли способ или сделать соединение в этом столбце или запустите запрос по этим данным, который вставляет соответствующие записи в новую таблицу?
Полученные данные должны выглядеть так:
+---------+-------------+
| part_id | material_id |
+---------+-------------+
| 339 | 1 |
| 339 | 2 |
| 970 | 2 |
+---------+-------------+
Я мог бы подумать о решении, если DBMS поддерживает функции, возвращающие таблицу, но MySQL, по-видимому, этого не делает.
Ответы
Ответ 1
В MySQL это может быть достигнуто как ниже
SELECT id, length FROM vehicles WHERE id IN ( 117, 148, 126)
+---------------+
| id | length |
+---------------+
| 117 | 25 |
| 126 | 8 |
| 148 | 10 |
+---------------+
SELECT id,vehicle_ids FROM load_plan_configs WHERE load_plan_configs.id =42
+---------------------+
| id | vehicle_ids |
+---------------------+
| 42 | 117, 148, 126 |
+---------------------+
Теперь, чтобы получить длину запятой, разделяемой идентификатором корабля, используйте ниже запрос
Output
SELECT length
FROM vehicles, load_plan_configs
WHERE load_plan_configs.id = 42 AND FIND_IN_SET(
vehicles.id, load_plan_configs.vehicle_ids
)
+---------+
| length |
+---------+
| 25 |
| 8 |
| 10 |
+---------+
Для получения дополнительной информации посетите http://amitbrothers.blogspot.in/2014/03/mysql-split-comma-separated-list-into.html
Ответ 2
Я ответил на два одинаковых вопроса за столько дней, но не получил никаких ответов, поэтому я думаю, что люди откладываются с помощью курсора, но, как и должно быть, это один процесс, который я лично не считаю важным.
Как вы заявили, MySQL не поддерживает типы возвращаемых таблиц, поэтому у вас есть мало возможностей, кроме как зацикливать таблицу и анализировать строку csv материала и генерировать соответствующие строки для части и материала.
Интересны следующие сообщения:
разделять ключевые слова для post php mysql
Процедура MySQL для загрузки данных из промежуточной таблицы в другие таблицы. Необходимо разделить многозначное поле в процессе
Rgds
Ответ 3
В MySQL нет повторного использования временных таблиц, а функции не возвращают строки.
Я не могу найти ничего в Qaru для преобразования строки целых чисел CSV в строки, поэтому я написал свою собственную в MySQL.
DELIMITER $$
DROP PROCEDURE IF EXISTS str_split $$
CREATE PROCEDURE str_split(IN str VARCHAR(4000),IN delim varchar(1))
begin
DECLARE delimIdx int default 0;
DECLARE charIdx int default 1;
DECLARE rest_str varchar(4000) default '';
DECLARE store_str varchar(4000) default '';
create TEMPORARY table IF NOT EXISTS ids as (select parent_item_id from list_field where 1=0);
truncate table ids;
set @rest_str = str;
set @delimIdx = LOCATE(delim,@rest_str);
set @charIdx = 1;
set @store_str = SUBSTRING(@rest_str,@charIdx,@delimIdx-1);
set @rest_str = SUBSTRING(@rest_str from @delimIdx+1);
if length(trim(@store_str)) = 0 then
set @store_str = @rest_str;
end if;
INSERT INTO ids
SELECT (@store_str + 0);
WHILE @delimIdx <> 0 DO
set @delimIdx = LOCATE(delim,@rest_str);
set @charIdx = 1;
set @store_str = SUBSTRING(@rest_str,@charIdx,@delimIdx-1);
set @rest_str = SUBSTRING(@rest_str from @delimIdx+1);
select @store_str;
if length(trim(@store_str)) = 0 then
set @store_str = @rest_str;
end if;
INSERT INTO ids(parent_item_id)
SELECT (@store_str + 0);
END WHILE;
select parent_item_id from ids;
end$$
DELIMITER ;
call str_split('1,2,10,13,14',',')
Вам также нужно будет привести к разным типам, если вы не используете int.
Ответ 4
Вы также можете использовать REGEXP
SET @materialids=SELECT material FROM parttable where part_id=1;
SELECT * FROM material_id WHERE REGEXP CONCAT('^',@materialids,'$');
Это поможет, если вы хотите получить только одну часть. Конечно, не вся таблица