首页 > 解决方案 > SQL Join 与代码聚合

问题描述

我正在尝试开发从我的关系数据库(mysql)中检索聚合信息的最佳方法。我有两个表:供应商和模型。两者之间是一对多的关系,即一个厂商可以有多个模型,一个模型只能与一个厂商关联。

从两个表中检索信息以使每个供应商都有其关联模型的最佳方法是什么?我的想法是制作一个 REST API,以便它可以具有以下输出:

{
    name: "one",
    description: "one description",
    models: [
        {
            name: "one_model_1",
            price: 100
        },
        {
            name: "one_model_2",
            price: 200
        }
    ]
    ...
  1. 通过在两个表之间进行连接来检索。这样,将获得以下输出:

    select v.name as vendorName, v.description as vendorDescription, m.name 
    as modelName, m.price as modelPrice from vendor v inner join model m on 
    v.id = m.vendor_id;
    

    1

    问题是必须执行代码处理以将每个供应商元素与模型列表相关联。在这种情况下,来自数据库的信息会带来来自供应商的重复信息。

  2. 首先搜索所有供应商,然后循环它们以检索相关模型。这里将提出 N + 1 的问题,因为需要一个查询来获取 N 个供应商,然后再通过 N 个查询来检索模型。

  3. 首先搜索供应商。然后,从供应商的 id 中检索所有模型,并通过代码建立供应商-模型关联。

我想知道什么是最好的解决方案。

标签: mysqlsqlforeign-keysinner-joinquery-performance

解决方案


SELECT v.Name, v.Description,
       GROUP_CONCAT(CONCAT(m.Name, ':', m.Price))
    FROM Vendors AS v
    JOIN Models AS m ON v.id = m.vendor_id
    GROUP BY v.Name, v.Description

一次调用,文本操作在返回结果集之前完成。


推荐阅读