MySQL группа по дате меньше, чем несколько дат

0

это сложно (я думаю). Мне нужно сгруппировать таблицу несколькими датами. сложная часть состоит в том, что мне не нужна группа, чтобы быть конкретной датой, мне нужно, чтобы все значения были меньше, чем дата. поэтому, если бы это было только для одной даты, мой запрос будет выглядеть так.

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 запроса?

  • 0
    Почему бы не объединить столько «ИЛИ созданный_ХХ <ХХХ», сколько было в массиве, и выполнить только один запрос?
  • 0
    @ Sal00m, я думаю, что он хочет отдельное количество для каждой даты массива, правильно @Amit?
Показать ещё 2 комментария
Теги:

3 ответа

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', затем запустите этот запрос

1

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

Динамически генерировать запрос, как показано ниже:

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 и т.д., Которое может быть отформатировано в любой базе данных по требованию.

Тем не менее вы можете улучшить это лучше, применив свои логические вещи. Это не точный скомпилированный код, считайте его ссылкой для достижения того же.

  • 0
    Привет спасибо. это решение хорошо, оно дает мне динамические столбцы, а затем строки. так что я выбираю другое решение, но большое спасибо, что он открыт для новой техники
  • 0
    Да, как я уже говорил, это не точное решение, но вы можете найти новый путь, взяв ссылку.
0

Проверьте это:

SELECT created_at , count(*) 
FROM users 
WHERE created_at < '2016-01-01' 
GROUP BY created_at;

Запрос возвращает сгруппированные даты с количеством строк для каждой даты.

  • 0
    Требуется получить отдельный счетчик для каждой даты массива. Есть несколько значений, таких как '' 2016-01-01 ',' 2016-01-02 ', ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню