如何用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
相关产品推荐
相关产品推荐

