Этот запрос вычисляет количество совпадающих чисел на комбинацию. утверждение «Имеющий счет (c1.nb)» гарантирует, что будут возвращены только комбинации с по крайней мере 3 совпадающими числами

ая информация

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

Установлен:

id
name

SetItem:

set_id
item_id
position

TEMPSET:

id

У меня есть функция, которая генерирует новые случайные комбинации изItem Таблица. По сути, всегда после успешного создания я создаю новую строку вSet таблицу, получить его идентификатор и добавить все идентификаторы предметов вSetItem Таблица.

проблема

Каждый раз перед созданием новой комбинации я усекаюTempSet заполнить новые идентификаторы предметов в этой таблице и проверить процент сходства, сравнивая с предыдущими комбинациями вSetItem Таблица. если сходство новой комбинации больше или равно 30%, мне нужно предотвратить эту комбинацию и заново сгенерировать новую комбинацию.

Сходство означает - наличие элементов по ранее сформированным комбинациям. Итак, идея заключается в следующем:

если более 3 элементов вновь сгенерированного набора повторяются на некотором ранее сгенерированном наборе, предотвратите это и попытайтесь сгенерировать другую комбинацию.

Вот функция, которая генерирует новые комбинации:

  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

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

У меня вопрос, что я делаю не так?

Ответы на вопрос(0)

Ваш ответ на вопрос