从MySql中的不同表中获取父记录和子记录(一对多)

时间:2017-02-09 07:40:04

标签: mysql node.js

我有一个名为orders的父表和一个order_items的子表。我需要为每个订单获取客户的订单和相应的订单商品。下面是架构:

订单:

Id   | Order_date | Order_value
-------------------------------
1234 | 2016-12-12 | 700.00

订购商品:

Id    | ProductId  | OrderId
----------------------------
8847  | shirt_blue | 1234
8848  | shirt_red  | 1234

我需要JSON的最终结果,如下所示:

{
   id: '1234',
   order_date: '2016-12-12',
   order_value: 700.00,
   Items: [
      {id: '8847', productid: 'shirt_blue' },
      {id: '8848', productid: 'shirt_red' }
  ]
}

从MySql获取这些记录的最简洁,最快捷的方法是什么?如果它有任何区别,我正在使用NodeJS / Node-MySql。

目前我首先获取订单记录并在我的应用层中循环它们并获取订单商品记录并将它们附加到每条记录。这不是一种非常有效的做事方式。

2 个答案:

答案 0 :(得分:2)

你可以尝试Sequelize,这是Node.js的ORM构建,支持MySQL,PostgreSQL,SQLite和MSSQL。 使用Sequelize,您可以创建反映数据库表的模型。第一步是实例化sequelize本身:

var sequelize = new Sequelize('mysql://user:pass@example.com:3306/dbname');

然后你就可以创建模型了:

var Order = sequelize.define('Order', {
    order_date: Sequelize.DATE,
    order_value: Sequelize.STRING
});

Order.sync(); // this is run in order to reflect the changes in your database

您还可以定义模型(数据库表)之间的关系:

var OrderItem = sequelize.define('OrderItem', {
    // attributes etc...
});

OrderItem.belongsTo(Order); // this would add OrderId attribute to OrderItem, which is a Foreign Key to Order table
Order.hasMany(Order);

通过创建关系,您可以返回指定OrderItems的{​​{1}}:

Order

在创建模型(表格)和迁移模型方面,这是一个非常舒适的解决方案。您还可以创建自定义SQL语句并通过Order.findById(1).then(function(order){ order.getOrderItems().then(function(orderItems){ // here you get all order items assigned to given order }); }); 实例直接运行它们。 查看文档,它包含大量示例并精确描述大多数用例。

答案 1 :(得分:0)

较新版本的 MySQL 支持 JSON 对象结果。 这将让您返回嵌套的子数组。

好处是您可以编写嵌套的 SQL 查询(因此 SQL 可以优化),而不是手动获取 Node.js 中的所有子元素。

How do I generate nested json objects using mysql native json functions?