📜  nodejs sql 以数组形式获取一对多关系 - SQL (1)

📅  最后修改于: 2023-12-03 14:44:44.200000             🧑  作者: Mango

Node.js SQL 实现一对多关系数组获取

如果你使用 Node.js 并且需要获取数据库中一对多关系的数据,那么本文将为您介绍如何以数组形式获取这种关系。

数据库模型

首先我们需要了解一对多关系的数据库模型。以订单和订单项为例,一个订单可以对应多个订单项。在数据库中可以这样表示:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer VARCHAR(255),
    order_date DATE
);

CREATE TABLE order_items (
    id INT PRIMARY KEY,
    order_id INT,
    product VARCHAR(255),
    price DECIMAL(10,2),
    FOREIGN KEY (order_id) REFERENCES orders(id)
);

其中 orders 表中的 id 字段是主键,表示订单号。order_items 表中的 id 字段同样是主键,表示订单项编号;order_id 字段是外键,表示当前订单项所属的订单。

SQL 查询

要以数组形式获取一对多关系,我们需要使用 SQL 查询。查询语句应当联结 orders 表和 order_items 表,以获取每个订单下的所有订单项。

SELECT
    orders.*,
    order_items.id as item_id,
    order_items.product,
    order_items.price
FROM orders
LEFT JOIN order_items ON orders.id = order_items.order_id;

这条查询语句会返回所有订单和订单项的信息,每行都表示一个订单项。如果同一订单下有多个订单项,订单信息会在每个订单项的行中重复出现。

Node.js 代码实现

使用 mysql 包可以在 Node.js 中连接 MySQL 数据库。使用以下代码连接数据库并执行查询。

const mysql = require('mysql');

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'database'
});

connection.connect();

const query = `
    SELECT
        orders.*,
        order_items.id as item_id,
        order_items.product,
        order_items.price
    FROM orders
    LEFT JOIN order_items ON orders.id = order_items.order_id
`;

connection.query(query, (error, results, fields) => {
    if (error) throw error;

    // 根据订单 ID 分组
    const orders = results.reduce((acc, row) => {
        const { id, customer, order_date, item_id, product, price } = row;

        if (!acc[id]) {
            // 如果当前订单不存在于前面遍历到的订单中,则加入订单数组
            acc[id] = { id, customer, order_date, items: [] };
        }

        // 将订单项加入当前订单的 items 数组
        const orderItem = { id: item_id, product, price };
        acc[id].items.push(orderItem);

        return acc;
    }, {});

    console.log(orders);
});

connection.end();

这段代码首先通过 mysql.createConnection 创建连接,然后使用 connection.query 方法执行查询,并将结果按订单 ID 分组。这个分组过程使用了 Array.prototype.reduce 方法,用于将查询结果转换成多维数组。最后打印结果。

结论

以上就是在 Node.js 中通过 SQL 查询以数组形式获取一对多关系的实现方法。关键的查询语句和数据处理部分都有详细介绍,您可以根据自己的需求进行修改。