Этот запрос вычисляет количество совпадающих чисел на комбинацию. утверждение «Имеющий счет (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.
У меня вопрос, что я делаю не так?