Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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权重SQL结果_Php_Mysql_Sql - Fatal编程技术网

PHP权重SQL结果

PHP权重SQL结果,php,mysql,sql,Php,Mysql,Sql,我有一个mysql表,其中存储了一个名为tickets的列,tickets值可以是任意数字 我想做的是使用一个mysql查询,从列中选择所有行,按降序排序,然后使用PHP对查询结果进行加权,以便选择票证值最高的行的几率更高 听起来很混乱。从本质上讲,一排票的数量越高,被挑选的机会就越大 使用程序化mysqli选择行并使用PHP获取票证,还有什么方法可以做到这一点吗?因此,查询本身不会得到您想要的结果,这本质上是一种加权随机选择。听起来你需要做的是选择所有的行,然后把它们放在一个数字索引的数组中,

我有一个mysql表,其中存储了一个名为tickets的列,tickets值可以是任意数字

我想做的是使用一个mysql查询,从列中选择所有行,按降序排序,然后使用PHP对查询结果进行加权,以便选择票证值最高的行的几率更高

听起来很混乱。从本质上讲,一排票的数量越高,被挑选的机会就越大


使用程序化mysqli选择行并使用PHP获取票证,还有什么方法可以做到这一点吗?

因此,查询本身不会得到您想要的结果,这本质上是一种加权随机选择。听起来你需要做的是选择所有的行,然后把它们放在一个数字索引的数组中,数组中有X个票证的行以不同的索引放置X次。然后随机选择一个介于0和[ARRAY_SIZE-1]之间的数字来确定您选择的行

因此,查询可能如下所示:

SELECT id, tickets FROM table
其中id将是表的主键

代码可能如下所示:

// your DB query logic here
// proceed with following code only if non-empty result set is returned

// build the array
$selection_array = array();
while($row = /* your DB row fetch mechanism here */) {
    $temp = array_fill(0, (int)$row['tickets'], $row['id']);
    $selection_array = array_merge($selection_array, $temp);
}

// select value from array
$random = rand(0, count($selection_array) - 1);
$selected_id = $selection_array[$random];

嗯,只是一个想法

你可以把票的价值乘以一个随机数

... ORDER BY tickets*RAND() DESC
通过这种方式,您将获得的记录不是按票号排序,而是按修改后的编号排序


RAND将为检查的每一行返回一个不同的随机值,但由于原始数字更高,结果也有可能更高。

mysqli与SQL的执行方式无关我会穿上衣服,谢谢你说的是什么机会?如果按票证描述排序,则该列中具有最高值的行将位于结果集中的第一行,但偶然性不取决于ORDERBY子句;MySQL用于获取信息,php用于处理信息。使用MySQL获取行,使用PHP根据您的要求随机选择票证。我编辑了这个问题,希望它更有意义。有人能解释一下草莓的评论吗?这和我想要的完全一样,但是从表中筛选数千行和数百万张票据有点慢。@Kidd396从操作上讲,这应该是n是查询返回的id数。票证数量应该无关紧要,除非您加入另一个表以确定作为此查询一部分的票证计数。如果您知道您只想将选择限制在前100个票数左右,那么您当然可以在查询中添加一个limit子句,但这也会引入ORDER BY的需要-我正试图跳过这一点。