Solución:
Esta es prácticamente la misma pregunta que ¿Puede Mysql dividir una columna?
MySQL no tiene una función de cadena dividida, por lo que debe realizar soluciones alternativas. Puede hacer cualquier cosa con los datos una vez que los haya dividido utilizando uno de los métodos enumerados en la página de respuestas anterior.
Puede recorrer esa función personalizada y romper cuando regrese vacía, tendrá que jugar y aprender algo de sintaxis (o al menos lo haría yo) pero la sintaxis para un bucle FOR en mysql está aquí: http: //www.roseindia .net / sql / mysql-example / for.shtml
Puede iterar sobre él, incrementando la posición en la función a continuación:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
(Crédito: https://blog.fedecarg.com/2009/02/22/mysql-split-string-function/)
Que debería devolver ” si no se encuentra ninguna coincidencia, así que rompa el ciclo si no se encuentra ninguna coincidencia. Esto le permitirá con solo mysql analizar la cadena dividida y ejecutar las consultas de inserción en una tabla temporal. Pero hombre, ¿por qué no usar un lenguaje de secuencias de comandos como php para ese tipo de trabajo? 🙁
Código para la sintaxis de bucle:
DELIMITER $$
CREATE PROCEDURE ABC(fullstr)
BEGIN
DECLARE a INT Default 0 ;
DECLARE str VARCHAR(255);
simple_loop: LOOP
SET a=a+1;
SET str=SPLIT_STR(fullstr,"|",a);
IF str="" THEN
LEAVE simple_loop;
END IF;
#Do Inserts into temp table here with str going into the row
insert into my_temp_table values (str);
END LOOP simple_loop;
END $$
Encontré una buena solución para esto
https://forums.mysql.com/read.php?10,635524,635529
Gracias a Peter Brawley
Truco: masajee un resultado de Group_Concat () en la cadena csv en una cadena Insert … Values …:
drop table if exists t;
create table t( txt text );
insert into t values('1,2,3,4,5,6,7,8,9');
drop temporary table if exists temp;
create temporary table temp( val char(255) );
set @sql = concat("insert into temp (val) values ('", replace(( select group_concat(distinct txt) as data from t), ",", "'),('"),"');");
prepare stmt1 from @sql;
execute stmt1;
select distinct(val) from temp;
+------+
| val |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+------+
Además, si solo desea unir alguna tabla a la lista de id, puede usar el operador LIKE. Existe mi solución en la que obtengo una lista de identificaciones de las URL de las publicaciones del blog, las convierto a listas separadas por comas que comienzan y terminan con comas y luego me uno a los productos relacionados por la lista de identificaciones con el operador LIKE.
SELECT b2.id blog_id, b2.id_list, p.id
FROM (
SELECT b.id,b.text,
CONCAT(
",",
REPLACE(
EXTRACTVALUE(b.text,'//a/@id')
, " ", ","
)
,","
) AS id_list
FROM blog b
) b2
LEFT JOIN production p ON b2.id_list LIKE CONCAT('%,',p.id,',%')
HAVING b2.id_list != ''
DELIMITER $$
CREATE PROCEDURE SPLIT_VALUE_STRING()
BEGIN
SET @String = '1,22,333,444,5555,66666,777777';
SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
myloop: WHILE (@Occurrences > 0)
DO
SET @myValue = SUBSTRING_INDEX(@String, ',', 1);
IF (@myValue != '') THEN
/* my code... */
ELSE
LEAVE myloop;
END IF;
SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
IF (@occurrences = 0) THEN
LEAVE myloop;
END IF;
SET @String = SUBSTRING(@String,LENGTH(SUBSTRING_INDEX(@String, ',', 1))+2);
END WHILE;
END $$