猿问

如何有效地检索Mysql表的前20个引用值以及PHP

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


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


+----+--------+---------+-----------+

| id | name   | photoId | companyId |

+----+--------+---------+-----------+

| 1  | Person | 33      | 50        |

+----+--------+---------+-----------+

| 2  | Cat    | 33      | 50        |

+----+--------+---------+-----------+

| 3  | Dog    | 33      | 50        |

+----+--------+---------+-----------+

最终,这张桌子可能会变得巨大。如果上传了 500,000 张照片,并且每个照片中识别了 20 个对象,则为 10,000,000 行。

问题

  • 我应该担心此表中的潜在行数吗?

  • 有没有办法有效地查询此表,以便为自己提供每个公司已识别的前5个对象的列表?我有一个尝试,如下所示,但它似乎已经很迟钝,因为我存储的最小数据。object.companyId

我的尝试:

从 MySql 检索结果:

select * from object where 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


慕田峪4524236
浏览 94回答 1
1回答

阿晨1998

您可以直接在MySQL查询中获取给定公司的前5个对象:SELECT name, COUNT(*) AS cntFROM objectWHERE companyId = 50GROUP BY nameORDER BY cnt DESCLIMIT 5这将返回值计数最高的 5 行(或您在子句中放置的行数)。只要您打开了索引,并且无论表大小如何,此查询都应运行良好。LIMITnamenamecompanyId
随时随地看视频慕课网APP
我要回答