php - 如何与 PHP 一起高效检索 Mysql 表的前 20 个引用值

标签 php mysql

我有一个object 表,在其中存储与照片中识别的对象相关的数据。这意味着每张照片可以有多行。

object 表格示例,显示 1 张照片中识别出的 3 个对象。

+----+--------+---------+-----------+
| id | name   | photoId | companyId |
+----+--------+---------+-----------+
| 1  | Person | 33      | 50        |
+----+--------+---------+-----------+
| 2  | Cat    | 33      | 50        |
+----+--------+---------+-----------+
| 3  | Dog    | 33      | 50        |
+----+--------+---------+-----------+

最终,这个表可能会变得很大。如果上传 500,000 张照片,每张照片识别 20 个对象,则为 10,000,000 行。

问题

  • 我是否应该担心此表中的潜在行数?
  • 有没有一种方法可以通过 object.companyId 高效地查询此表,以便为自己提供每个公司已识别的前 5 个对象的列表?我进行了如下所示的尝试,但由于我存储的数据很少,它看起来已经很缓慢。

我的尝试:

从 MySql 检索结果:

从 companyId=50 的对象中选择 *

在 PHP 中迭代结果以获取每个标签的计数:

foreach($res as $row){
    //get how many times this label shows up in the results
    $labelCnt                     =  array_count_values(array_column($res, 'name'))[$row['name']];
    //create an array of all label counts (label -> cnt)
    $allLabelCntArr[$row['name']] = $labelCnt;
}
arsort($allLabelCnts); //sort from highest to lowest
$topFive = array_slice($allLabelCnts, 0, 5, true); //get top 5

最佳答案

您可以直接在 MySQL 查询中获取给定公司的前 5 个对象:

SELECT name, COUNT(*) AS cnt
FROM object
WHERE companyId = 50
GROUP BY name
ORDER BY cnt DESC
LIMIT 5

这将返回具有最高 name 值计数的 5 行(或在 LIMIT 子句中输入的行数)。只要您在 namecompanyId 上有索引,无论表大小如何,此查询都应该表现良好。

Demo on SQLFiddle

关于php - 如何与 PHP 一起高效检索 Mysql 表的前 20 个引用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59759945/

相关文章:

php - 通过将用户的ID +时间加密为JSON来创建访问 token

PHP 输出到 img 标签

mysql - 来自 mysql 函数的 Srtange 结果

php - 将多个值放入一列但PHP中的不同行

mysql - 问题: Joining two views in MySQL

php select from where multi dual

php - 重新登录 phpmyadmin 后,存储过程在 mysql 中消失

php - 在表2中查找表1的真实数据

PHP - 在 composer.json 中读取版本号

php - 从包含不同且不相关信息的多个表中获取 mysql 搜索结果