Verificación y prevención de cadenas similares durante la inserción en MySQL

Breve informacion

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.

Problema

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?

Respuestas a la pregunta(5)

Su respuesta a la pregunta