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粉9795861592024-04-04 09:11:08
我認為對資料如何返回以及第二個查詢如何運作有誤解。根據您的說法:
您將傳回多行。所以第一個查詢有效。但是取回多行將導致 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 查詢,而不是兩個。