3

我正在尝试通过使用主键 _id 和以下查询从表(用户)中检索随机行。

SELECT * 
FROM   user 
WHERE  _id IN (SELECT Floor(1 + ( Rand() * ( Count(_id) - 1 ) )) 
               FROM   user); 

没有从表中删除任何行,但我(不一致地)返回了多行......

我觉得这很神奇,因为子查询的任何结果肯定会返回一个整数,它针对主键.....应该始终只有 1 条记录!

我想使用一个查询,我可能会使其成为一个准备好的语句,并且我没有使用 LIMIT 子句,因为我不能使用@variables 来选择随机行。

我的 MySQL 欢迎声明告诉我我的版本如下: 服务器版本:5.5.29-0ubuntu0.12.04.2 (Ubuntu)

4

3 回答 3

3

如何ORDER BY RAND() LIMIT 1;在您的查询中使用而不是where _id IN (select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user);

您得到多行原因(从用户那里选择 FLOOR(1+(RAND()*(COUNT(_id)-1))))将在“用户”表中为您返回一个不同的值。那是因为 RAND 位。

select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user自行运行,您将看到。

于 2013-03-08T16:06:27.697 回答
1

随机部分每行被评估一次,所以有时你会得到很多行,有时你什么也得不到。简单快速的使用和等值连接和限制

SELECT 
    * 
FROM 
    user 
WHERE 
    _id > (
        SELECT 
            FLOOR(1+(RAND()*(max(_id)-min(_id)))) 
        FROM 
            user
    ) LIMIT 1
;
于 2013-03-08T16:10:53.523 回答
0
select * 
from user join (select FLOOR(1+(RAND()*(COUNT(_id)-1))) as _id from user) as Temp
on user._id=Temp._id

小提琴 - http://sqlfiddle.com/#!2/2fda3/11

于 2013-03-08T16:13:41.480 回答