Verificación y prevención de cadenas similares durante la inserción en MySQL
Tengo 3 mesas:
Conjunto:
id
name
SetItem:
set_id
item_id
position
TempSet:
id
Tengo una función que genera nuevas combinaciones aleatorias a partir deItem
mesa. Básicamente, siempre después de una generación exitosa, creo una nueva fila enSet
tabla, obtenga su id y agregue todos los identificadores de elementos enSetItem
mesa.
Cada vez antes de generar una nueva combinación trunco elTempSet
tabla, complete los nuevos identificadores de elementos en esta tabla y compruebe el porcentaje de similitud comparándolo con combinaciones anteriores enSetItem
mesa. Si la nueva similitud de combinación es mayor o igual al 30%, necesito evitar esta combinación y volver a generar una nueva combinación.
Similitud significa: existencia de elementos en combinaciones generadas previamente. Entonces, la idea es:
Si se repiten más de 3 elementos del conjunto recién generado en algún conjunto generado previamente, evítelo e intente generar otra combinación.
Aquí hay una función que genera nuevas combinaciones:
CREATE DEFINER = `root` @`localhost` FUNCTION `gen_uniq_perm_by_kw` (
comboSize INT ( 5 ),
tries INT ( 3 )
) RETURNS text CHARSET utf8 SQL SECURITY INVOKER BEGIN
iterat :
LOOP
DELETE
FROM
`TempSet`;
INSERT INTO `TempSet` ( `id` ) (
SELECT
`i`.`id`
FROM
`Item` AS `i`
ORDER BY
RAND( )
LIMIT comboSize
);
IF
(
SELECT
1
FROM
`SetItem`
GROUP BY
`set_id`
HAVING
sum(
CASE
WHEN EXISTS (
SELECT
id
FROM
`TempSet`
WHERE
`id` = `item_id`
LIMIT 1
) THEN
1 ELSE 0
END
) / count( 1 ) * 100 >= 30
LIMIT 1
) < 1 THEN
RETURN ( SELECT GROUP_CONCAT( id SEPARATOR '-' ) FROM `TempSet` );
END IF;
SET tries := tries - 1;
IF
tries = 0 THEN
RETURN NULL;
END IF;
END LOOP iterat;
END
Cuando lo pruebo, incluso cuando los elementos de la combinación recién generada no existen en ninguna otra combinación generada previamente, como resultado, devuelve un valor nulo.
Mi pregunta es, ¿qué estoy haciendo mal?