это сложно (я думаю). Мне нужно сгруппировать таблицу несколькими датами. сложная часть состоит в том, что мне не нужна группа, чтобы быть конкретной датой, мне нужно, чтобы все значения были меньше, чем дата. поэтому, если бы это было только для одной даты, мой запрос будет выглядеть так.
select count(*) from users where created_at <= '2016-01-01'
поэтому мое текущее и плохое решение - это просто сделать столько запросов, сколько у меня есть. например, если у меня есть и массив из десяти дат, которые означают, что мой код будет выглядеть так
for(let i = 0; i< dates.length;i++){
db.query('select count(*) from users where created_at <= '${dates[i]}'')
}
желаемый выход:
dates = [ '2016-06-01' ,' 2016-04-01' ,'2016-02-01']
table users:
id | created_at
1 | 2016-01-01
2 | 2016-02-01
3 | 2016-03-01
4 | 2016-04-01
5 | 2016-05-01
6 | 2016-06-01
outpout:
date | count
'2016-06-01' | 6
'2016-04-01' | 4
'2016-02-01' | 2
есть ли способ достичь этого с помощью 1 запроса?
//объяснил логику с помощью java, но надеюсь, что это поможет :)
вы можете достичь этого, используя union, сначала соедините все даты и сделайте запрос, используя union,
String sqlPart="";
String union="";
for(int i = 0; i< dates.length;i++){
sqlPart=sqlPart+union;
sqlPart=sqlPart + "SELECT created_at , count(*) FROM users WHERE created_at <= "+ dates[i];
union="union";
}
поэтому ваш окончательный запрос будет сформирован в 'sqlPart', затем запустите этот запрос
Есть способ получить это в одном ударе базы данных, да, некоторые логические вещи должны делать:
Динамически генерировать запрос, как показано ниже:
query = "SELECT "
for(let i = 0; i< dates.length;i++){
if(i>0) query +=",";
query += "SUM(if(created_at <='${dates[i]}',1,0))";
}
query += " from users ";
если вы знаете максимальную дату заранее, добавьте ниже часть также, чтобы получить ее быстрее:
query += " WHERE created_at<= 'Maxdate' ";
И, наконец, попал в базу данных.
db.query(query);
Здесь вы получите следующий результат: 6,4,2
Теперь здесь каждое значение столбца даст счет для даты в той же последовательности массива.
Пример: первое значение 6 является значением для 1-го значения массива, которое составляет 2016-06-01 и т.д., Которое может быть отформатировано в любой базе данных по требованию.
Тем не менее вы можете улучшить это лучше, применив свои логические вещи. Это не точный скомпилированный код, считайте его ссылкой для достижения того же.
Проверьте это:
SELECT created_at , count(*)
FROM users
WHERE created_at < '2016-01-01'
GROUP BY created_at;
Запрос возвращает сгруппированные даты с количеством строк для каждой даты.