無法從巢狀 SQL 查詢取得數據
P粉594941301
P粉594941301 2024-04-03 15:44:01
0
1
473

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 查詢,而不是兩個。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板