为什么我在MYSQL查询中获得多行?

时间:2013-03-08 15:59:53

标签: mysql sql random count floor

我正在尝试使用主键_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)

3 个答案:

答案 0 :(得分:3)

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

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

单独运行select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user,你会看到。

答案 1 :(得分:1)

每行评估一次随机部分,所以有时会得到很多行,有时你却得不到。为了方便快捷地使用和平等加入和限制

SELECT 
    * 
FROM 
    user 
WHERE 
    _id > (
        SELECT 
            FLOOR(1+(RAND()*(max(_id)-min(_id)))) 
        FROM 
            user
    ) LIMIT 1
;

答案 2 :(得分: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