Php 如何将这3个查询合并为一个查询?
您好,我正在尝试从3个不同的类别中选择10x3个随机id,但是有没有更聪明的方法可以在一个查询而不是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
$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;