【问题标题】:why am I getting multiple rows in MYSQL query?为什么我在 MYSQL 查询中得到多行?
【发布时间】:2013-02-24 05:46:29
【问题描述】:

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

【问题讨论】:

  • 您是否有多个相同值的_id?如果返回行,则执行SELECT _ID1, count(_id1) from user group by _id1 having count(_id1) > 1,那就是你的问题
  • 尝试运行这部分查询(从用户处选择 FLOOR(1+(RAND()*(COUNT(_id)-1))) 或尝试将IN 替换为=,如果它给您错误,您可以知道问题出在哪里
  • @MattBusche 即使对于唯一的 _id 值,我也设法重现了这一点。请看sqlfiddle.com/#!2/2fda3/7;您将获得 0、1 或 2 个结果。
  • @PawanNogariya 它似乎与 = 而不是 IN 表现相同:sqlfiddle.com/#!2/2fda3/6
  • @PawanNogariya 多试几次 :)

标签: mysql sql random count floor


【解决方案1】:

如何在查询中使用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,你会看到。

【讨论】:

  • 这是一个更清洁的解决方案。
  • 这是一个很好的解决方案,但问题不是“我如何...”;它是“为什么我会得到多个结果?”
  • 啊,是的。傻我。每行一次,谢谢!
  • 这里是文档的链接,您可以在其中找到所有这些信息:dev.mysql.com/doc/refman/5.0/en/…
【解决方案2】:

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

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

【讨论】:

  • 我不认为它每行评估一次;它使用count,因此它是一个总是产生一个值的聚合。您可以尝试多次执行子查询 (select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user) 来确认这一点。
  • +1 我收回了;我认为这可能是奇怪结果的解释。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2010-11-17
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多