无法从嵌套 SQL 查询获取数据
P粉594941301
P粉594941301 2024-04-03 15:44:01
0
1
414

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,
    });
  }
};

在上述代码的第一个查询中,我从 jobs 表中获取所有行。在第二个嵌套查询中,我试图从 shift 表中获取第一个查询返回的每个 jobsID 的所有行。但我没有得到任何数据。数据存在,它应该返回数据,但我没有得到任何数据。我在这里做错了什么?请帮忙!

P粉594941301
P粉594941301

全部回复(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 查询,而不是两个。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!