- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试创建一个 MySQL 函数,它将 n
和 m
作为输入并生成随机 n
的唯一组合m
来自查询结果的 id。
每次调用该函数将返回一个组合,并且该组合必须与之前的所有组合不同。
在生成期间它必须检查另一个表:如果组合已经存在,继续循环直到每个组合保持唯一。以破折号分隔的 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
的第二个表中,并检查 hash
列是否存在。并继续这个循环,直到我得到 n
个结果。
我不知道如何正确快速地实现这一目标。有什么建议吗?
更新:
整个 SQL 转储在这里:https://gist.github.com/anonymous/e5eb3bf1a10f9d762cc20a8146acf866
最佳答案
如果您通过 md5 测试唯一性,则需要在获取 md5 之前对列表进行排序。这可以用 SELECT MD5('1-2'), MD5('2-1');
去掉LEFT
,好像没什么用。之后,优化器可以选择以 ItemKeyword
而不是 Item
开始。 (在不知道数据分布的情况下,我不能说这是否有帮助。)
(如果您为每个表提供 SHOW CREATE TABLE
会很有帮助。如果没有,我会假设您使用的是 InnoDB 并且有 PRIMARY KEY(id)
和 PRIMARY KEY(keywordID)
。)
需要“复合”索引:
Item: INDEX(user_id, type, id)
ItemKeyword: INDEX(ItemID, keywordID)
ItemKeyword
闻起来像一个多对多映射表。 大多数这样的表都可以改进,从扔掉 id
开始。参见 7 tips on many:many .
我有点迷失在你的二次加工中。
My tips on RAND可能有帮助也可能没有帮助。
模式批判
PRIMARY KEY
是一个UNIQUE KEY
是一个INDEX
;消除冗余索引。INT(4)
-- (4)
没有任何意义; INT
总是 32 位(4 字节),范围很大。请参阅 SMALLINT UNSIGNED
(2 个字节,0..64K 范围)。CHAR(32) CHARACTER SET ascii
,而不是 255,也不是 utf8。 (latin1
可以。)组合
(id + hash)好像没用。相反,只需将 Item
表中的 KEY md5 (md5) USING BTREE,
更改为 UNIQUE(md5)
。SET NAMES utf8mb4;
开始使用 utf8mb4,但表(及其列)仍然是 utf8
。表情符号和中文需要utf8mb4
;大多数其他文本没有。解决这些问题后,原始问题可能 得到解决(以及进行一些清理)。如果现在,请添加一些进一步的说明。
缩小
1. 获取 m
个唯一 ID 的排序列表。 (下一步我需要“排序”,并且由于您正在寻找“组合”,因此似乎不需要“排列”。)
SELECT GROUP_CONCAT(id) AS list
FROM (
SELECT id FROM tbl
ORDER BY RAND()
LIMIT $m
) AS x;
2. 检查唯一性。通过获取 MD5(list)
(从上面)并检查“使用过的”md5 表来执行此操作。注意:除非您要求在一小部分 ID 中进行大量组合,否则不太可能出现重复(尽管并非不可能)。
3. 交付列表
。但是,它是一串用逗号分隔的 ID。拆分它最好在应用程序代码中完成,而不是 MySQL 函数。
4.您将如何处理该列表?这可能很重要,因为将步骤 4 折叠到步骤 3 中可能很方便。
底线:我只会在 SQL 中执行第 1 步和第 2 步的一部分;我会在应用程序代码中构建一个“函数”来完成剩下的工作。
关于MySQL 快速检查 hash 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789101/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!