Вопрос или проблема
У меня есть SQL-запрос в nodejs, который должен возвращать 3 результата, но он возвращает только первый из трех. (Не все результаты)
const { custuuid } = req.params;
var LocIds = req.query.LocIds;
console.log(LocIds);
// LocIds = 125,124,126
let sql =
"SELECT L.LocID,L.LocType,L.LocName,L.LocTitle,L.LocAddress,L.StartDate,L.EndDate,L.LocLat,L.LocLng FROM ml_locations L WHERE L.LocID IN (?) and L.CustUUID = ? Order By LocName ASC";
const [rows] = await pool.query(sql, [[LocIds], custuuid]);
console.log(rows);
console.log("Готово.");
что генерирует следующий вывод:
125,124,126
[
{
LocID: 125,
LocType: 1,
LocName: 'Maui',
LocTitle: 'Maui',
LocAddress: 'Maui, Hawaii',
StartDate: 2024-10-06T05:00:00.000Z,
EndDate: 2024-10-06T05:00:00.000Z,
LocLat: 20.7983626,
LocLng: -156.3319253
}
]
Готово.
Тем не менее, он должен возвращать 3 результата. (по одному для каждого местоположения 124, 125, 126). Когда я вручную запускаю SQL в phpMyAdmin, он работает как задумано:
SELECT L.LocID,L.LocType,L.LocName,L.LocTitle,L.LocAddress,L.StartDate,L.EndDate,L.LocLat,L.LocLng FROM ml_locations L WHERE L.LocID IN (124,125,126) and L.CustUUID = ‘XXXX’ Order By LocName ASC
Мысли?
Похоже, вы передаете строку вместо массива. Можете попробовать
var LocIds = req.query.LocIds.split(',').map(id => parseInt(id, 10));
и
const [rows] = await pool.query(sql, [LocIds, custuuid]);
Чтобы проверить, решает ли это вашу проблему.
Ответ или решение
Проблема, с которой вы столкнулись, заключается в том, что переменная LocIds
, переданная в ваш SQL-запрос, представляет собой строку, а не массив. Когда вы передаёте строку, содержащую значения идентификаторов ("125,124,126"
), в качестве параметра в SQL-запрос, библиотека для работы с базой данных воспринимает её как один элемент, в результате чего возвращается только первая запись.
Чтобы исправить это, вам нужно преобразовать строку в массив чисел. Это можно сделать с помощью метода split()
для разделения строки по запятой и map()
для преобразования строковых значений в целые числа. Давайте внесём соответствующие изменения в ваш код.
Вот корректированный код:
const { custuuid } = req.params;
let LocIds = req.query.LocIds;
console.log(LocIds); // LocIds = "125,124,126"
// Преобразуем строку в массив чисел
LocIds = LocIds.split(',').map(id => parseInt(id, 10));
let sql =
"SELECT L.LocID, L.LocType, L.LocName, L.LocTitle, L.LocAddress, L.StartDate, L.EndDate, L.LocLat, L.LocLng " +
"FROM ml_locations L WHERE L.LocID IN (?) AND L.CustUUID = ? ORDER BY LocName ASC";
const [rows] = await pool.query(sql, [LocIds, custuuid]);
console.log(rows);
console.log("Done.");
Пояснение:
-
Преобразование строки в массив чисел:
- Мы используем
split(',')
, чтобы разделить строку по запятой и получить массив строковых значений. - Затем применяем
map(id => parseInt(id, 10))
, чтобы преобразовать каждую строку в целое число.
- Мы используем
-
Передача параметров в запрос:
- Теперь, передавая
[LocIds, custuuid]
в методawait pool.query()
, мы гарантируем, чтоLocIds
представляет собой массив чисел, что корректно обработается в запросе SQL.
- Теперь, передавая
После внесения этих изменений ваш запрос должен правильно возвращать все соответствующие записи (в данном случае 3 результата, соответствующие идентификаторам 124, 125 и 126).