我有一个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
子句中输入的行数)。只要您在 name
和 companyId
上有索引,无论表大小如何,此查询都应该表现良好。
关于php - 如何与 PHP 一起高效检索 Mysql 表的前 20 个引用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59759945/