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 的所有行。但我没有得到任何数据。数据存在,它应该返回数据,但我没有得到任何数据。我在这里做错了什么?请帮忙!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我认为对数据如何返回以及第二个查询如何工作存在误解。根据您的说法:
您将返回多行。所以第一个查询有效。但是取回多行将导致
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's和shift的数据库方案,您可能需要扩展*并显式列出所有表名称,例如SELECT jobs.jobsID、jobs.<xyz>、shift.isBooked、shift.fk_job [...] FROM [...]。如果两个表中都有相同名称的列,则可能需要解决由join引起的冲突,同时组合列以返回结果,如下所示:SELECT [...] shift.<xyz> as shift_xyz [. ..]来自...[]。还有一个优点,您还只需要一个 SQL 查询,而不是两个。