Попытка построить запрос для получения количества строк между двумя месяцами с помощью Knex. js - PullRequest
0 голосов
/ 08 мая 2020

У меня есть программа управления отслеживанием проблем, в которой я пытаюсь создать запрос SQL для возврата массива строк за каждый месяц.

Я пробовал использовать while l oop to l oop сквозной и пу sh длина рядов после каждого. Однако он возвращает массив до того, как l oop будет выполнено.

Я знаю, что могу также использовать count () для получения длины строки, но мне просто нужно получить месяцы от 1 до 6;

Есть ли более простой запрос?

getMonthlyData(db, teamId){
    let monthlyData = [];
    let i = 1;
while (i < 6){
db
    .from('issues')
    .select('*')
    .where({team_id: teamId})
    .andWhereRaw(`EXTRACT(MONTH FROM date_created::date) = ?`, [i])
    .then(rows => {
        console.log('Monthly data')
        console.log(rows);
        monthlyData.push(rows.length)
     })
     .catch((e) => {
          console.log(e);
     }) 
    }
    return monthlyData;
}

Спасибо

1 Ответ

0 голосов
/ 09 мая 2020

Эквивалентно вашему запросу с асинхронными c исправленными ошибками, и в качестве одного запроса должен быть:

async getMonthlyData(db, teamId) {
  return db('issues')
    .where({team_id: teamId})
    .whereBetween(db.raw(`EXTRACT(MONTH FROM date_created::date)`), [1,6]);
}

Другой способ записать его с дополнительным столбцом, сообщающим извлеченный месяц, будет:

async getMonthlyData(db, teamId) {
  // after this query you can easily group the resulted issues by month
  return db('issues')
    .select('*', db.raw(`EXTRACT(MONTH FROM date_created::date) as month`))
    .where({team_id: teamId})
    .whereBetween(month, [1,6]);
}
...