您好我正在尝试从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);
答案 0 :(得分:5)
您可以使用200
,例如:
UNION ALL
答案 1 :(得分:0)
这并不容易。您的方法可能是最好的方法。我的意思是,查询之间的union all
稍微好一些,但考虑到执行ORDER BY 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个随机行。