首页 > 解决方案 > SQL:如何为给定可变长度行名数组的行添加列

问题描述

假设我有一个项目数据库,每个项目都有以下列:name、amount1、amount2、amount3。给定一个名称数组(长度不同),我如何查询数据库以获取指定名称的每一列的每一列的总和?因此,如果我有一个“thing1”和“thing2”的数组,它将从 thing1 和 thing2 返回 amount1 的总和,对于 amount2 和 amount 3 也是如此。

例如:示例数据库:

数据库图片

名称= [事物1,事物2]

查询 = ?

输出 :

像这张照片的东西

我使用了以下查询,但无法弄清楚如何扩展它来处理可变长度的名称数组,也无法处理所有列:

SELECT SUM(amount1) AS Amount1Sum FROM table where name = "thing1" or name ="thing2";

对于一些额外的上下文,这个请求是从 node.js 服务器使用 express 发出的。

这是在我的服务器中实现它的路线(使用下面的建议之一):

    app.post("/counter",function(req, res) {
        let items = req.body.name
        let sqlquery = "SELECT SUM(amount1) as amount1Sum, SUM(amount2) as amount2Sum, SUM(amount3) as amount3Sum FROM table where name in (?)";

        // query database
        db.query(sqlquery, items, (err, result) => {
            if (err) {
                return console.error(err.message);
            }
            console.log(result)
        });
    });

使用 thing1 和 thing2 检查表单的输出是[ RowDataPacket { amount1Sum: 213, amount2Sum: 5432, amount3Sum: 23} ],我确认名称数组确实包含 thing1 和 thing2。它只是返回 thing1 列,而不是为所有名称添加列。

标签: mysqlsqlnode.jsexpress

解决方案


使用WHERE name IN (?)并传递 JS 数组作为对应参数来匹配动态列表。

names = ['thing1', 'thing2'];
connection.query(`SELECT SUM(amount1) AS amount1sum, SUM(amount2) AS amount2sum, SUM(amount3) AS amount3sum
FROM table
WHERE name IN (?)`, [names], function(err, results) {
    ...
});

推荐阅读