我遇到了一个小问题。我正在使用代码片段创建一个网络应用程序。用户面临着两个标记相似的随机代码片段,他们必须选择他们最喜欢的两个中的哪一个,或者他们可以跳过(类似于 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/