Ila*_*ila 6 mysql sql hash combinations similarity
我有3张桌子:
组:
id
name
Run Code Online (Sandbox Code Playgroud)
SetItem:
set_id
item_id
position
Run Code Online (Sandbox Code Playgroud)
TEMPSET:
id
Run Code Online (Sandbox Code Playgroud)
我有一个从Item表生成新的随机组合的函数.基本上,总是在成功生成之后,我在Set表中创建一个新行,获取它的id并将所有项ID添加到SetItem表中.
每次生成新组合之前,我都会截断TempSet表格,将新项目ID填入此表格,并通过与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
Run Code Online (Sandbox Code Playgroud)
当我测试它时,即使新生成的组合元素在任何其他先前生成的组合中不存在,它也会返回null.
我的问题是,我做错了什么?
Lau*_*ELE -1
CREATE TABLE `combinations` (
`id` INT(10) NOT NULL,
`nb` INT(10) NOT NULL,
`orderid` INT(10) NOT NULL,
PRIMARY KEY (`id`, `orderid`),
INDEX `On_nb` ( `nb`,`id`)
)
COLLATE='utf8_bin'
ENGINE=InnoDB
;
insert into `combinations` values
(1, 13446,1),
(1, 10860,2),
(1, 10885,3),
(1, 10853,4),
(1, 13048,5),
(1, 13044,6),
(1, 10918,7),
(1, 10916,8),
(1, 6519,9),
(1, 10860,10),
(2, 13527,1),
(2, 10933,2),
(2, 10928,3),
(2, 10922,4),
(2, 6595,5),
(2, 10944,6),
(2, 13446,7),
(2, 10860,8),
(2, 10885,9),
(2, 19888,10),
(3, 13364,1),
(3, 12949,2),
(3, 6732,3),
(3, 6763,4),
(3, 13542,5),
(3, 6617,6),
(3, 13125,7),
(3, 13058,8),
(3, 13059,9),
(3, 30111,10);
select c1.id, count(c1.nb) from `combinations`as c1, `combinations` as c_ori
where c1.nb=c_ori.nb and c_ori.id=2 and c1.id!=c_ori.id
group by c1.id having count(c1.nb)>=3
"id" "count(c1.nb)"
"1" "4"
Run Code Online (Sandbox Code Playgroud)
由于最后一个查询返回某些内容,因此第二个组合已经存在,粒度至少为 30%。请注意,在您的第一个组合中,数字 10860 出现了两次。该算法不考虑正确重复的数字。您的组合中需要重复的数字吗?