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

时间:2017-04-17 11:44:57

标签: 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 (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);

2 个答案:

答案 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个随机行。