有一个数据库,其中包含两个对此任务很重要的表:
- 包含与网页上显示的项目相关的所有数据的项目的项目
- 保存这些项目的视图数的视图
任务是检索具有最多视图数的 50 个项目,然后随机显示其中的 10 个。当前的解决方案似乎有点无效,因为它从数据库中检索这 50 个项目的完整信息,只是为了打乱结果,显示其中的前 10 个并丢弃其余的。有没有更有效的方法来解决这个问题,最好是通过优化数据库查询?
$query = "SELECT items.*, (SELECT items_views.views FROM items_views WHERE items_views.item = items.id) as views FROM items ORDER BY views DESC LIMIT 0, 50";
$result = mysqli_query($conn, $query);
$final_array = array();
while($row = mysqli_fetch_assoc($result)) {
$final_array[] = $row;
}
if(is_array($final_array)) {
$amount_to_display = 10;
$result_count = 0;
shuffle($final_array);
foreach($final_array as $final_row) {
// display the results here
if (++$result_count >= $amount_to_display) break;
}
}
首先,您可以从两个表中选择数据,而无需对视图使用第二个SELECT
。最重要的是,您可以按LIMIT 10
和随机顺序应用第二SELECT
:
$query = "(SELECT
i.*, iv.views
FROM
items i
LEFT JOIN items_views iv ON iv.item = i.id
ORDER BY
iv.views DESC
LIMIT 0, 50)
ORDER BY RAND() LIMIT 0, 10";
此方法将节省任何其他 PHP 逻辑。