php - 在 SQL 表中选择两个随机行,其中列的值非常接近

标签 php mysql sql random similarity

我遇到了一个小问题。我正在使用代码片段创建一个网络应用程序。用户面临着两个标记相似的随机代码片段,他们必须选择他们最喜欢的两个中的哪一个,或者他们可以跳过(类似于 Facemash,但使用代码片段而不是图片)。

我有一个名为 CodeSnippets 的表,其中包含以下字段:

  • Id - 代码片段的 ID
  • 分数 - 代码片段的分数
  • 其他一些不重要的列

分数是一个实数。

我的问题:如何编写一个查询来获取两个分数非常接近的随机记录?问题是我必须订购三次:RAND()、Score 和 RAND(),并留有余量。

这是我已经拥有的:

SELECT Id, Score, Code FROM CodeSnippets ORDER BY RAND() LIMIT 2

但这只是选择两个随机记录,即使它们的分数彼此相差很远:)

有人能给我指出正确的方向吗?

最佳答案

可以用子查询来实现吗?首先进行自连接查询以选择分数在阈值内的所有对,然后取出第一个随机对:

SELECT TOP 1 Id1, Id2
FROM (
  SELECT C1.Id AS Id1, C2.Id AS Id2 FROM CodeSnippets C1, CodeSnippet C2
  WHERE C1.Id <> C2.Id AND ABS(C1.Score-C2.Score) < [Threshold]
)
ORDER BY RAND()

请小心,因为并非所有数据库引擎都支持子查询(尽管大多数都应该支持)。大多数引擎也会优化/重写子查询以快速运行,但某些嵌入式数据库引擎可能只是运行子查询,在内存中创建临时表,然后在临时表上运行外部查询,从而导致性能不佳。如果是这种情况,您需要使用联接重写此查询。

关于php - 在 SQL 表中选择两个随机行,其中列的值非常接近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268972/

相关文章:

php - 使用 Eloquent 选择关系计数为零的所有记录?

php - 获取 GROUP_CONCAT 值作为单独的值

mysql - 计数不同的值,其中另一个值的计数 = 1

php - 编辑记录 PHP 表单

PHP/xdebug 分析器 require_once 性能不佳

php - 使用 cron 作业每月通过 MySQL SELECT 查询更改 PHP 变量

php - 如何将localhost phpmyadmin连接到android模拟器

mysql - 如何使用哈希表优化查询速度

PHP 5.4 和 PEAR 邮件

php - 如何制作国家/地区特定网站(和内容)?