Es können keine Daten aus einer verschachtelten SQL-Abfrage abgerufen werden
P粉594941301
P粉594941301 2024-04-03 15:44:01
0
1
452

const getCompanyShifts = (req, res) => {
  try {
    const { company_id } = req.params;
    connection.query(
      `SELECT * FROM jobs WHERE company_fk=${company_id}`,
      (err, rowss) => {
        if (!err) {
          connection.query(
            `SELECT * FROM shift WHERE isBooked=1 AND fk_job = ?`,
            [rowss.jobsID],
            (err, rows) => {
              if (err || rows.length === 0) {
                res.status(404).json({
                  success: false,
                  message: "Company Shifts Not Found!",
                  err,
                });
              } else {
                const shifts = [];
                rows.forEach((row, i) => {
                  const shift = {
                    shiftID: rows[i].shiftID,
                    shiftStartTime: rows[i].startTime,
                    shiftEndTime: rows[i].endTime,
                    shiftDate: rows[i].date,
                    isBooked: rows[i].isBooked,
                    fk_job: rows[i].fk_job,
                    fk_guard: rows[i].fk_guard,
                  };
                  shifts.push(shift);
                });
                res.status(200).json({
                  success: true,
                  message: "Successfully Retrieved Company Shifts!",
                  shifts,
                });
              }
            }
          );
        } else {
          res.status(404).json({
            success: false,
            message: "Company Jobs Not Found!",
          });
        }
      }
    );
  } catch (error) {
    res.status(500).json({
      success: false,
      message: error.message,
    });
  }
};

In der ersten Abfrage des obigen Codes erhalte ich alle Zeilen von jobs 表中获取所有行。在第二个嵌套查询中,我试图从 shift 表中获取第一个查询返回的每个 jobsID. Aber ich bekomme keine Daten. Die Daten sind da und sollten die Daten zurückgeben, aber ich erhalte keine Daten. Was mache ich hier falsch? Bitte helfen Sie!

P粉594941301
P粉594941301

Antworte allen(1)
P粉979586159

我认为对数据如何返回以及第二个查询如何工作存在误解。根据您的说法:

您将返回多行。所以第一个查询有效。但是取回多行将导致 rowss 成为 array。因此,用作下一个查询的输入的 rowss.jobsID 不是数组的正确使用,我希望该表达式的值是 undefined ,这将导致第二个查询不返回任何内容。

为了证明像这样添加 console.log(rowss)

[...]
connection.query(
  `SELECT * FROM jobs WHERE company_fk=${company_id}`,
  (err, rowss) => {
    console.log(rowss);
[...]

为了解决这个问题,我建议使用sql功能并发出join。通过这样做,数据库将连接两个表,然后仅返回满足 where 条件的行。组合语句应如下所示:

SELECT * FROM jobs WHERE company_fk=${company_id} LEFT JOIN shift ON shift.fk_job = jobs.jobsID WHERE isBooked=1

提示:根据 ob'sshift 的数据库方案,您可能需要扩展 * 并显式列出所有表名称,例如SELECT jobs.jobsID、jobs.<xyz>、shift.isBooked、shift.fk_job [...] FROM [...]。如果两个表中都有相同名称的列,则可能需要解决由 join 引起的冲突,同时组合列以返回结果,如下所示: SELECT [...] shift.<xyz> as shift_xyz [. ..]来自...[]

还有一个优点,您还只需要一个 SQL 查询,而不是两个。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage