困难的MySQL自我加入请解释

时间:2011-01-19 07:28:10

标签: mysql

这应该能够返回一个随机的帖子ID。它也被称为使用MySQL的最快方法。

SELECT t.id 
FROM table t 
JOIN (SELECT(FLOOR(max(id) * rand())) AS maxid FROM table) 
AS tt 
ON t.id >= tt.maxid 
LIMIT 1     

似乎无法绕过这个,请帮忙。

2 个答案:

答案 0 :(得分:2)

您使用“已加入的表格”从表中选择一个随机ID号

 SELECT(FLOOR(max(id) * rand())) AS maxid FROM table

如果id中没有空洞(连续整数),这将只返回你可以使用的东西。 这就是你加入这个

的原因
 ON t.id >= tt.maxid 

您将获得比随机数更高的所有ID。然后限制就是第一个。

举个例子:假设你在表格中有这些条目:      1,2,5,7,8。

被覆盖的随机数将小于8,例如3.你加入会给你5,7和8但由于限制只返回5

答案 1 :(得分:0)

首先,格式化帮助

1. SELECT t.id 
2.   FROM table t 
3.          JOIN (SELECT(FLOOR(max(id) * rand())) AS maxid FROM table) AS tt 
4.          ON t.id >= tt.maxid 
5. LIMIT 1

让我们首先看一下JOIN中的子查询:

  • rand()返回范围[0,1]中的随机值(例如0.999,0.251,1)
  • max(id)表示您的查询将从指定的表中返回列id的最大值
  • 将输入数字舍入到最接近的整数(例如Floor(5.1)== 5,Floor(5.9)= 5)

因此,子查询将返回中的随机整数(由于FLOOR)数字 范围[0,1]

“LIMIT 1”表示您的查询只返回结果集中的一行。

希望这足够了。随意询问更多细节