You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Objectbox从Tablets和Mobiles实体获取搜索匹配的最近10个去重公司?

嘿,针对你这个从Tablets和Mobiles两个实体里提取最近10个去重公司的需求,我整理了两种靠谱的实现思路,还有优化点哦~

一、内存手动实现(对应你提到的思路)

这个方案适合数据量不大(比如你说的数百条)的场景,逻辑清晰好上手:

  • 第一步:分别从两个实体里查出所有带创建日期的公司记录(必须带创建日期,不然没法判断“最近添加”)
  • 第二步:把两个列表合并到一起
  • 第三步:按公司名称去重,同时要保留每个公司最新的创建日期(毕竟同一个公司可能在两个实体里都有记录,得拿它最近一次被添加的时间来排序)
  • 第四步:按创建日期倒序排,取前10条

给你补个Java风格的代码示例(换成你用的语言逻辑也一样):

// 1. 从两个仓库查询带创建时间的公司记录
List<CompanyRecord> tabletCompanies = tabletRepo.findAllWithCreateDate();
List<CompanyRecord> mobileCompanies = mobileRepo.findAllWithCreateDate();

// 2. 合并两个列表
List<CompanyRecord> allRecords = new ArrayList<>();
allRecords.addAll(tabletCompanies);
allRecords.addAll(mobileCompanies);

// 3. 去重并保留每个公司的最新创建时间
Map<String, LocalDateTime> companyLatestTimeMap = new HashMap<>();
for (CompanyRecord record : allRecords) {
    String company = record.getCompany();
    LocalDateTime createTime = record.getCreateDate();
    // 如果公司没存过,或者当前记录的时间更新,就替换
    if (!companyLatestTimeMap.containsKey(company) || createTime.isAfter(companyLatestTimeMap.get(company))) {
        companyLatestTimeMap.put(company, createTime);
    }
}

// 4. 排序取前10
List<String> top10Companies = companyLatestTimeMap.entrySet().stream()
    .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
    .limit(10)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());
二、数据库层面优化实现(更高效)

如果以后数据量涨上去(比如上万条),内存处理就有点吃力了,直接让数据库帮我们搞定会更高效,以MySQL为例,写个联合查询SQL:

SELECT company, MAX(create_date) AS latest_add_time
FROM (
    -- 合并两个表的公司和创建时间
    SELECT company, create_date FROM tablets
    UNION ALL
    SELECT company, create_date FROM mobiles
) AS combined_records
-- 按公司分组去重,取每个公司的最新添加时间
GROUP BY company
-- 按最新时间倒序,取前10
ORDER BY latest_add_time DESC
LIMIT 10;

要是用户在搜索栏输入了关键词,只要在子查询里加模糊匹配就行:

SELECT company, MAX(create_date) AS latest_add_time
FROM (
    SELECT company, create_date FROM tablets WHERE company LIKE CONCAT('%', :searchKeyword, '%')
    UNION ALL
    SELECT company, create_date FROM mobiles WHERE company LIKE CONCAT('%', :searchKeyword, '%')
) AS combined_records
GROUP BY company
ORDER BY latest_add_time DESC
LIMIT 10;

这个方案不用把大量数据捞到内存里处理,性能会好很多~

内容的提问来源于stack exchange,提问作者Jaya Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:54