Массив, переданный в запрос Mysql с помощью Node.js, возвращает только 1 результат, а не все [дубликат]

Вопрос или проблема

У меня есть 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.");

Пояснение:

  1. Преобразование строки в массив чисел:

    • Мы используем split(','), чтобы разделить строку по запятой и получить массив строковых значений.
    • Затем применяем map(id => parseInt(id, 10)), чтобы преобразовать каждую строку в целое число.
  2. Передача параметров в запрос:

    • Теперь, передавая [LocIds, custuuid] в метод await pool.query(), мы гарантируем, что LocIds представляет собой массив чисел, что корректно обработается в запросе SQL.

После внесения этих изменений ваш запрос должен правильно возвращать все соответствующие записи (в данном случае 3 результата, соответствующие идентификаторам 124, 125 и 126).

Оцените материал
Добавить комментарий

Капча загружается...