随机获取字段不在的行,mysql
我试图使用现有的一个高级随机函数从mysql数据库中获取一行。然而,当我尝试过滤以仅获取其中包含field=1的行时,一切都失败了。有人能指出我的错误吗随机获取字段不在的行,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)
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,从而使行在被选中后有可能被丢弃。如果最终结果是丢弃该行,是否可以在选择行或使系统进行另一轮操作之前应用此筛选?