Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Php 主键数据不连续时选择随机行_Php_Mysql - Fatal编程技术网

Php 主键数据不连续时选择随机行

Php 主键数据不连续时选择随机行,php,mysql,Php,Mysql,考虑到这一点,如果我的Id(主键)不是连续的(也就是说,我不能只做rand(1,max())?你可以按Id ASC排序,然后选择rand()行或更高的行: ... WHERE id >= rand(1, $max_id) ORDER BY id ASC LIMIT 1 您可以按id ASC订购,然后选择rand()行或更高的行: ... WHERE id >= rand(1, $max_id) ORDER BY id ASC LIMIT 1 您可以随机使用mysql\u fetc


考虑到这一点,如果我的
Id
(主键)不是连续的(也就是说,我不能只做
rand(1,max())

你可以按Id ASC排序,然后选择rand()行或更高的行:

...
WHERE id >= rand(1, $max_id)
ORDER BY id ASC
LIMIT 1

您可以按id ASC订购,然后选择rand()行或更高的行:

...
WHERE id >= rand(1, $max_id)
ORDER BY id ASC
LIMIT 1

您可以随机使用mysql\u fetch\u array()多次

$query=sprintf("SELECT * FROM acb");
$check=mysql_query($query);
for($i=1,$i<=rand($min_id,$max_id,$i++)
$row=mysql_fetch_array($check, MYSQL_ASSOC);
$query=sprintf(“从acb中选择*);
$check=mysql\u query($query);

对于($i=1,$i您可以使用mysql\u fetch\u array()随机次数

$query=sprintf("SELECT * FROM acb");
$check=mysql_query($query);
for($i=1,$i<=rand($min_id,$max_id,$i++)
$row=mysql_fetch_array($check, MYSQL_ASSOC);
$query=sprintf(“从acb中选择*);
$check=mysql\u query($query);

对于($i=1,$i您可以在php中使用
mysql\u data\u seek(resource$result,int$row\u number)

$result = mysql_query( 'SELECT * FROM `table`' );
mysql_data_seek( $result , mt_rand( 0 , mysql_num_rows( $result ) ) );

但是
mysql\u data\u seek
mysql\u num\u rows
不适用于无缓冲查询。

您可以在php中使用
mysql\u data\u seek(resource$result,int$row\u number)

$result = mysql_query( 'SELECT * FROM `table`' );
mysql_data_seek( $result , mt_rand( 0 , mysql_num_rows( $result ) ) );

但是
mysql\u data\u seek
mysql\u num\u rows
不适用于无缓冲查询。

对表进行随机排序的最佳方法是添加一个额外字段并用任意md5哈希填充它,然后在该字段上创建索引

这些散列可以是您喜欢的任何内容的散列,只要它们都不同。我建议散列主键ID字段,再加上任意的salt字符串

UPDATE myTable SET rand_hash = md5(concat(id,'anything here'))
有了这些,您的表将有一个几乎完全随机的排序顺序。您可以通过创建另一个任意md5散列,并查询最接近该值的记录,在随机点查询表。md5散列是随机分布的,因此每个记录都有相同的被拾取的机会。类似这样的情况就可以了诀窍:

SELECT * FROM myTable WHERE rand_hash >= md5(now()) LIMIT 1
最好的一点是,这将是对索引的查询,因此无论记录在表中的什么位置,都将是闪电般的快


希望这会有所帮助。

让表随机排序的最佳方法是添加一个额外字段,并用任意md5哈希填充它,然后在该字段上创建索引

这些散列可以是您喜欢的任何内容的散列,只要它们都不同。我建议散列主键ID字段,再加上任意的salt字符串

UPDATE myTable SET rand_hash = md5(concat(id,'anything here'))
有了这些,您的表将有一个几乎完全随机的排序顺序。您可以通过创建另一个任意md5散列,并查询最接近该值的记录,在随机点查询表。md5散列是随机分布的,因此每个记录都有相同的被拾取的机会。类似这样的情况就可以了诀窍:

SELECT * FROM myTable WHERE rand_hash >= md5(now()) LIMIT 1
最好的一点是,这将是对索引的查询,因此无论记录在表中的什么位置,都将是闪电般的快


希望对您有所帮助。

我尝试了以下查询。它比ORDER BY RAND()更快:

如果列“id”是自动递增的,我测试了这个查询比以前快得多:

SELECT * FROM table WHERE (id >= RAND() * (SELECT id FROM table ORDER BY id DESC LIMIT 1)) LIMIT 1;

我尝试了以下查询。它比ORDER BY RAND()更快:

如果列“id”是自动递增的,我测试了这个查询比以前快得多:

SELECT * FROM table WHERE (id >= RAND() * (SELECT id FROM table ORDER BY id DESC LIMIT 1)) LIMIT 1;

也许你可以选择“下一个最大的”和限制1?也就是说,不要使用
=rand(1,$max_id)
,而是使用
=rand(1,$max_id)LIMIT 1
。这是当前的领导者,其他人都有好主意吗?(然后,它确实需要查询max(id))。注意,你还需要一个id ASC订单,否则它不会重复rand()尽可能多。也许你可以选择“下一个最大的”和限制1?即,使用
=rand(1,$max\u id)
,而不是
=rand(1,$max\u id)LIMIT 1
。这是当前的领导者,其他人都有好主意吗?(再次强调,它确实需要查询max(id))请注意,您还需要一个ORDER BY id ASC,否则它不会像您希望的那样重复rand()。我已经有了一个用作索引的id,如果只使用SELECT*FROM myTable(其中索引>=random()限制1)会不会占用更少的db空间您需要
random()
了解最小和最大ID。此外,如果ID序列中存在任何间隙(例如从已删除的记录中),则不会得到随机分布。而且,使用md5解决方案,序列中的下一条记录也将是随机的,因此,如果需要多条记录,您可以增加限制,而不是多次查询。我已经有一个id用作索引,仅使用SELECT*FROM myTable WHERE index>=random()LIMIT 1您需要使用
random()
来了解最小和最大ID。此外,如果ID序列中存在任何间隙(例如从已删除的记录中),则不会得到随机分布。而且,使用md5解决方案,序列中的下一条记录也将是随机的,因此,如果需要多条记录,您可以增加限制,而不是多次查询。为什么要麻烦使用
ORDER BY
?因为MySQL不保证扫描表的顺序。W如果没有order by,如果在一行中多次执行查询,则可能会在一行中多次获得同一行。可以,但概率与
rand()相同
每次都等于该行的
id
否?为什么要麻烦使用
ORDER BY
?因为MySQL不保证它扫描表的顺序。没有ORDER BY,如果在一行中多次执行查询,您可能会在一行中多次得到同一行。您可以,但概率与
rand()
每次都等于该行的
id
否?