【问题标题】:JavaScript Array in a SQL query?SQL查询中的JavaScript数组?
【发布时间】:2017-01-12 21:22:42
【问题描述】:

是否可以在 sql 查询中使用 javascript 数组?

我想在第二个查询中使用 studentsId 作为参数。

db.query('SELECT users.* FROM users JOIN classes ON users.class_id=classes.id WHERE classes.id ="' + req.body.classSelect + '" ', function (err, rows) {

    // Saves all my users id that i get from my first query
    var studentsId = [];
    for (var i = 0; i < rows.length; i++) {
        studentsId.push(rows[i].id);
    }
    console.log(studentsId);

    // in this query i want to use studentsId
    db.query("SELECT users.id, users.first_name, users.last_name,attendances.type_id,attendances.attendance_timestamp FROM users JOIN attendances ON attendances.user_id = users.id WHERE attendance_timestamp BETWEEN '2016-01-01' AND '2016-12-31' AND user_id IN ('"+ studentsId +"') ", function (err, result) {
        if (err) {
            throw err;
        }
        console.log(result);
    });
});

【问题讨论】:

  • 仅当您使用例如 AJAX 将其发送到服务器时
  • 你为什么不把这两个查询和JOIN结合起来?
  • 不要在studentsId 周围加上引号。这使得它只是 IN() 列表中的一个元素,而不是 ID 列表。

标签: javascript mysql express


【解决方案1】:

是的,但与您的操作方式不同。

我会改变

studentsId.push(rows[i].id);

studentsId.push('"' + rows[i].id + '"');

接下来,改变这一行

db.query("SELECT users.id, users.first_name, users.last_name,
   attendances.type_id,attendances.attendance_timestamp FROM users 
   JOIN attendances ON attendances.user_id = users.id WHERE 
   attendance_timestamp BETWEEN '2016-01-01' AND '2016-12-31' 
   AND user_id IN ('"+ studentsId +"') ", function (err, result) {

到这里

db.query("SELECT users.id, users.first_name, users.last_name,
   attendances.type_id, attendances.attendance_timestamp FROM users 
   JOIN attendances ON attendances.user_id = users.id WHERE
   attendance_timestamp BETWEEN '2016-01-01' AND '2016-12-31' 
   AND user_id IN (' + studentsId.join(',') + ') ", function (err, result) {

那么你的代码应该可以正常运行了。

第一个更改将引号添加到 ID。如果您的 ID 是数字,这可能不是必需的。

第二个更改使用逗号将 ID 连接在一起,因此可以在 on 子句中使用它们。

【讨论】:

  • 当一个数组被转换为一个字符串时,它会自动用逗号连接,所以这实际上就是他在做的事情,除了它周围添加的引号。
  • 等等,这些年来我一直在白白使用 join -.-
  • 如果您向用户显示,您通常希望在逗号后放置一个空格。
【解决方案2】:

只需将JOINattendances 添加到第一个查询中,而不是进行单独的查询。

db.query('SELECT users.* FROM users JOIN classes ON users.class_id=classes.id join attendances ON attendances.user_id = users.id WHERE classes.id ="' + req.body.classSelect + '" AND attendance_timestamp BETWEEN "2016-01-01" AND "2016-12-31" ', function (err, rows) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多