Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 如何将这3个查询合并为一个查询?_Php_Mysql_Sql - Fatal编程技术网

Php 如何将这3个查询合并为一个查询?

Php 如何将这3个查询合并为一个查询?,php,mysql,sql,Php,Mysql,Sql,您好,我正在尝试从3个不同的类别中选择10x3个随机id,但是有没有更聪明的方法可以在一个查询而不是3个不同的查询中实现这一点 $sql = "SELECT id FROM rating WHERE category IN (1) ORDER BY RAND() LIMIT 10"; $result1 = $dbCon->query($sql); $arr; while ($obj = $result1->fetch_object()) { $arr[] = $obj->id

您好,我正在尝试从3个不同的类别中选择10x3个随机id,但是有没有更聪明的方法可以在一个查询而不是3个不同的查询中实现这一点

$sql = "SELECT id FROM rating WHERE category IN (1) ORDER BY RAND() LIMIT 10";
$result1 = $dbCon->query($sql);

$arr;
while ($obj = $result1->fetch_object()) {
$arr[] = $obj->id;
}

$sql = "SELECT id FROM rating WHERE category IN (2) ORDER BY RAND() LIMIT 10";
$result1 = $dbCon->query($sql);

while ($obj = $result1->fetch_object()) {
$arr[] = $obj->id;
}

$sql = "SELECT id FROM rating WHERE category IN (3) ORDER BY RAND() LIMIT 10";
$result1 = $dbCon->query($sql);

while ($obj = $result1->fetch_object()) {
$arr[] = $obj->id;
}


var_dump($arr);

这并不容易。你的方法可能是最好的方法。我的意思是,查询之间的联合稍微好一点,但是考虑到按rand排序的开销,这不会有多大的改进

MySQL中的另一种方法是使用变量:

SELECT id
FROM (SELECT r.*,
             (@rn := if(@c = category, @rn + 1,
                        if(@c := category, 1, 1)
                       )
             ) as rn
      FROM rating r CROSS JOIN
           (SELECT @c := -1, @rn := 0) params
      WHERE category IN (1, 2, 3)
      ORDER BY category, RAND()
     ) r
WHERE rn <= 10;

这种方法的优点是,您不必显式地指定所需的类别。您可以通过更改IN列表来添加新类别,或者完全删除WHERE子句,并为所有类别获取多达10个随机行。

这并不容易。你的方法可能是最好的方法。我的意思是,查询之间的联合稍微好一点,但是考虑到按rand排序的开销,这不会有多大的改进

MySQL中的另一种方法是使用变量:

SELECT id
FROM (SELECT r.*,
             (@rn := if(@c = category, @rn + 1,
                        if(@c := category, 1, 1)
                       )
             ) as rn
      FROM rating r CROSS JOIN
           (SELECT @c := -1, @rn := 0) params
      WHERE category IN (1, 2, 3)
      ORDER BY category, RAND()
     ) r
WHERE rn <= 10;
这种方法的优点是,您不必显式地指定所需的类别。您只需更改IN列表即可添加新类别,或完全删除WHERE子句,并为所有类别获取最多10个随机行。

您可以使用UNION all,例如:

您可以使用UNION ALL,例如:


是的,我很惊讶你有着我无法想象的声誉,但你投了反对票:O@BunkerBoy . . . 我的名声几乎与此无关。这是一个正确的答案,在某些情况下可能比联合所有人都好。工会在其他情况下可能会更好。我知道答案不是关于回复者回购协议,但用户应该在对任何人投反对票后给出适当的解释。这看起来很先进,我必须对此进行研究。我以前从未使用过类似的sql,我想@is how to declare variables?@GordonLinoff只是想澄清一下,我没有投反对票,为什么我会投反对票?是的,我很惊讶你拥有我无法想象的声誉,但你投了反对票:O@BunkerBoy . . . 我的名声几乎与此无关。这是一个正确的答案,在某些情况下可能比联合所有人都好。工会在其他情况下可能会更好。我知道答案不是关于回复者回购协议,但用户应该在对任何人投反对票后给出适当的解释。这看起来很先进,我必须对此进行研究。我以前从未使用过类似的sql,我假设@is是如何声明变量的?@GordonLinoff只是为了澄清,我没有否决它为什么我会这样做?。我不确定在我的示例中如何使用它?$sql=$result1=$dbCon->query$sql;我不确定在我的示例中如何使用它?$sql=$result1=$dbCon->query$sql;