首页 / MYSQL / MySQL快速检查哈希是否存在
MySQL快速检查哈希是否存在
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL快速检查哈希是否存在,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3343字,纯文字阅读大概需要5分钟。
内容图文
![MySQL快速检查哈希是否存在](/upload/InfoBanner/zyjiaocheng/886/f24f0cd5f6344fd2acb0f52572d09469.jpg)
我正在尝试创建一个MySQL函数,该函数将n和m作为输入,并从查询结果中生成m个id的随机n个唯一组合.
该函数将在每次调用时返回一个组合,并且该组合必须与所有先前的组合都不同.
在生成期间,它必须检查另一个表:如果组合已经存在,则要继续循环直到每个组合保持唯一.以破折号分隔的ID形式返回组合,或者如果没有空间让唯一组合返回false.
所以我得到了100个像这样的随机物品:
SELECT
`Item`.`id`
FROM
`Item`
LEFT JOIN `ItemKeyword` ON `Item`.`id` = `ItemKeyword`.`ItemID`
WHERE
(`Item`.`user_id` = '2')
AND(`ItemKeyword`.`keywordID` = 7130)
AND(`Item`.`type` = 1)
ORDER BY RAND()
LIMIT 100
过去的组合通过-存储为itemID的串联的md5.
因此,我需要通过-连接此查询的结果,并为其创建md5.然后将另一个查询发送到名为Combination的第二个表中,并使用哈希列检查是否存在.并继续此循环,直到得到n个结果.
我不知道如何正确,快速地实现这一目标.有什么建议吗?
更新:
整个SQL转储在这里:https://gist.github.com/anonymous/e5eb3bf1a10f9d762cc20a8146acf866
解决方法:
排列
DROP FUNCTION IF EXISTS unique_perm;
DELIMITER //
CREATE FUNCTION unique_perm()
RETURNS VARCHAR(255) CHARACTER SET ascii
NOT DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
SET @n := 0;
iterat: LOOP
SELECT SUBSTRING_INDEX(
GROUP_CONCAT(province ORDER BY RAND() SEPARATOR '-'),
'-', 3) INTO @list -- Assuming you want M=3 items
FROM world.provinces;
SET @md5 := MD5(@list);
INSERT IGNORE INTO md5s (md5) VALUES (@md5); -- To prevent dups
IF ROW_COUNT() > 0 THEN -- Check for dup
RETURN @list; -- Got a unique permutation
END IF;
SET @n := @n + 1;
IF @n > 20 THEN
RETURN NULL; -- Probably ran out of combinations
END IF;
END LOOP iterat;
END;
//
DELIMITER ;
输出:
mysql> SELECT unique_perm(), unique_perm(), unique_perm()\G
*************************** 1. row ***************************
unique_perm(): New Brunswick-Nova Scotia-Quebec
unique_perm(): Alberta-Northwest Territories-New Brunswick
unique_perm(): Manitoba-Quebec-Prince Edward Island
1 row in set (0.01 sec)
笔记:
>我对M = 3进行了硬编码;根据需要进行调整. (它可以作为arg传递.)
>根据需要更改列名和表名.
>如果不使用@n进行测试,则如果组合用完,可能会陷入循环. (但是,如果N适度较大,那是“不可能的”,因此您可以删除测试.)
>如果M足够大,则需要增加@@ group_concat_max_len.另外,RETURNS.
>创建表md5s(md5 CHAR(32)CHARACTER SET ascii PRIMARY KEY)ENGINE =需要InnoDB.并且,您将需要在该函数的批次调用之间截断md5.
>这是一个可行的例子.
>缺陷:它提供独特的排列,而不是独特的组合.如果那还不够,请继续阅读…
组合方式
DROP FUNCTION IF EXISTS unique_comb;
DELIMITER //
CREATE FUNCTION unique_comb()
RETURNS VARCHAR(255) CHARACTER SET ascii
NOT DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
SET @n := 0;
iterat: LOOP
SELECT GROUP_CONCAT(province ORDER BY province SEPARATOR '-') INTO @list
FROM ( SELECT province FROM world.provinces
ORDER BY RAND() LIMIT 2 ) AS x; -- Assuming you want M=2 items
SET @md5 := MD5(@list);
INSERT IGNORE INTO md5s (md5) VALUES (@md5); -- To prevent dups
IF ROW_COUNT() > 0 THEN -- Check for dup
RETURN @list; -- Got a unique permutation
END IF;
SET @n := @n + 1;
IF @n > 20 THEN
RETURN NULL; -- Probably ran out of combinations
END IF;
END LOOP iterat;
END;
//
DELIMITER ;
输出:
mysql> SELECT unique_comb(), unique_comb(), unique_comb()\G
*************************** 1. row ***************************
unique_comb(): Quebec-Yukon
unique_comb(): Ontario-Yukon
unique_comb(): New Brunswick-Nova Scotia
1 row in set (0.01 sec)
笔记:
>子查询会增加一些成本.
>请注意,现在(必须)对每个输出字符串中的项目进行了排序.
内容总结
以上是互联网集市为您收集整理的MySQL快速检查哈希是否存在全部内容,希望文章能够帮你解决MySQL快速检查哈希是否存在所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。