Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
随机获取字段不在的行,mysql_Mysql_Random_Filter - Fatal编程技术网

随机获取字段不在的行,mysql

随机获取字段不在的行,mysql,mysql,random,filter,Mysql,Random,Filter,我试图使用现有的一个高级随机函数从mysql数据库中获取一行。然而,当我尝试过滤以仅获取其中包含field=1的行时,一切都失败了。有人能指出我的错误吗 SELECT username, message, ttime FROM table WHERE done LIKE '1' AS r1 JOIN (SELECT (RAND() * (SELECT MAX(id) FROM database)) AS id)

我试图使用现有的一个高级随机函数从mysql数据库中获取一行。然而,当我尝试过滤以仅获取其中包含field=1的行时,一切都失败了。有人能指出我的错误吗

SELECT username, message, ttime 
FROM table WHERE done LIKE '1' AS r1 JOIN 
   (SELECT (RAND() *
                 (SELECT MAX(id)
                    FROM database)) AS id)
    AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1;";

问题中的查询有多个语法错误。 你想要这样的东西吗

SELECT username, message, ttime 
FROM database.table1 as r1 
INNER JOIN 
   (SELECT (RAND() * MAX(id)) as a_random_id
    FROM database.table1) r2
ON (r1.id >= r2.a_random_id)
WHERE done = '1'
ORDER BY r1.id ASC
LIMIT 1
我想知道这种变体是否更快:

SELECT r.username, r.message, r.ttime 
FROM database.table1 r 
WHERE r.id = (  
  SELECT MIN(r1.id)  <<-- this should make MySQL stop after the first hit.
  FROM database.table1 r1 
  INNER JOIN 
     (SELECT (RAND() * MAX(id)) as a_random_id
      FROM database.table1) AS r2
  ON (r1.id >= r2.a_random_id)
  WHERE r1.done = '1') sub

哦,你不是从数据库中选择,而是从数据库中的一个表中选择。

为什么需要高级随机函数?我正试图从一个巨大的数据库中获取一个随机行,使用传统代码是一种缓慢的方法。此外,这可以减少删除行的问题。许多表都有一个自动递增的整数主键。删除一行时,出现的孔不会被填充,它们只会保留。在r1.id>=r2.id而不是r1.id=r2.id上进行测试修复了一个问题,即您可能会以轻微的性能成本击中一个洞……以及结果概率中的一些偏差。删除行之后的行被选中的几率更高。这是可行的,但它会在随机化完成后应用WHERE done,从而使行在被选中后有可能被丢弃。如果最终结果是丢弃该行,是否可以在选择行或使系统进行另一轮操作之前应用此筛选?