插件窝 干货文章 如何在多表查询中获取某个公司的所有产品的最新检测报告?

如何在多表查询中获取某个公司的所有产品的最新检测报告?

product report company reports 251    来源:    2025-03-30

多表查询获取公司最新检测报告方案

问题理解

您需要从一个包含多个表的数据库中查询某个公司的所有产品的最新检测报告。这通常涉及: - 公司表 - 产品表 - 检测报告表 - 可能的关联表

解决方案

假设的数据库结构

假设有以下表结构: 1. companies - 公司信息 2. products - 产品信息,包含公司ID外键 3. test_reports - 检测报告,包含产品ID外键和报告日期

SQL查询方案

方案1:使用子查询获取最新报告

SELECT p.product_name, r.report_content, r.report_date
FROM products p
JOIN test_reports r ON p.product_id = r.product_id
JOIN companies c ON p.company_id = c.company_id
WHERE c.company_name = '目标公司名称'
AND r.report_date = (
    SELECT MAX(report_date)
    FROM test_reports
    WHERE product_id = p.product_id
)

方案2:使用窗口函数(更高效)

WITH latest_reports AS (
    SELECT 
        p.product_name,
        r.report_content,
        r.report_date,
        ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY r.report_date DESC) as rn
    FROM products p
    JOIN test_reports r ON p.product_id = r.product_id
    JOIN companies c ON p.company_id = c.company_id
    WHERE c.company_name = '目标公司名称'
)
SELECT product_name, report_content, report_date
FROM latest_reports
WHERE rn = 1;

方案3:使用LEFT JOIN排除法

SELECT p.product_name, r.report_content, r.report_date
FROM products p
JOIN companies c ON p.company_id = c.company_id
JOIN test_reports r ON p.product_id = r.product_id
LEFT JOIN test_reports r2 ON r.product_id = r2.product_id AND r.report_date < r2.report_date
WHERE c.company_name = '目标公司名称'
AND r2.report_id IS NULL;

性能优化建议

  1. 索引优化

    • 确保company_nameproduct_idreport_date字段有索引
    • 为外键关系创建索引
  2. 分页处理: 如果数据量大,考虑添加分页:

    LIMIT 20 OFFSET 0
    
  3. 缓存结果

    • 考虑使用缓存存储频繁查询的结果
    • 可以定期刷新缓存

注意事项

  1. 根据实际数据库结构调整表名和字段名
  2. 考虑添加更多筛选条件(如报告状态、类型等)
  3. 对于超大数据集,考虑使用物化视图或定期汇总表

您需要根据实际的数据库结构和业务需求调整上述SQL语句。如果您能提供更具体的表结构信息,我可以给出更精确的查询方案。