За последние 24 часа нас посетили 22292 программиста и 1050 роботов. Сейчас ищет 651 программист ...

Выборка из базы по дням

Тема в разделе "PHP и базы данных", создана пользователем AlexProg, 3 фев 2021.

Метки:
  1. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Всем добра!

    Выборка из базы по дням, мать её.
    https://www.db-fiddle.com/f/eWrLmWNSfN1JHL1NLS7Jbv/0

    Парни подскажите, пожалуйста, как выбрать из таблицы последние 7 дней (по date_create).
    По каждому дню нужно ещё COUNT() coments и birthday

    Спасибо всем кто откликнется!
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Ну, по поводу последнего за 7 дней, то это несложно.
    Код (Text):
    1. SELECT *
    2. FROM `db_profile`
    3. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
    Гуглится, кстати, за пять секунд.
    А по поводу остального нужны уточнения - это всё в одном запросе нужно? Тогда, наверное не получится. По крайней мере без излишеств.
     
    AlexProg нравится это.
  3. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Хотелось бы. Как ещё можно?
    В итоге хочу вот так:
    | дата первого дня | количество всего 12 | кол-во всего 32 |
    | дата второго дня | количество всего 23 | кол-во всего 45 |
    ...
    | дата седьмого дня | количество всего 3 | кол-во всего 5 |
    --- Добавлено ---
    Видимо не так выразился.
    Нужно что-то типо группировки по каждому дню. Не всего вывести по интервалу, а сгруппировать.
    Т.е. на странице 7 записей всего должно быть, а сейчас их 100500, но правда за 7 дней выбрало.
     
  4. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Пробовал вот так: (дичь какая-то)

    PHP:
    1. SELECT DATE_FORMAT(`db_profile`.`date_create`, '%d.%m.%Y') AS `date`, COUNT(`id`) AS `count`
    2.             FROM db_profile
    3.             WHERE `db_profile`.`date_create` >= '2021-01-20' AND `db_profile`.`date_create` <= ('2021-01-26' + INTERVAL 7 DAY)
    4.             GROUP BY DATE_FORMAT(`db_profile`.`date_create`, '%d.%m.%Y')
    5.             ORDER BY `db_profile`.`date_create` DESC
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Без тестов не обойтись.
    Нужна примерная таблица с большим разнообразием дат, имен, id и тд.
     
  6. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Эта маленькая? https://www.db-fiddle.com/f/eWrLmWNSfN1JHL1NLS7Jbv/0
    7 записей

    Мой вариант вроде бы сработал, но не могу вывести количество по статусам.
    Типо если role = 1 - посчитали вывели за день
    если role = 2, так же посчитали вывели за день и т.д.
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Можно попробовать выбрать их в отдельную таблицу, и объединить с остальным, по id.
     
    AlexProg нравится это.
  8. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Код (Text):
    1. CREATE TEMPORARY TABLE IF NOT EXISTS my_profile
    2. SELECT *
    3. FROM `db_profile`
    4. WHERE `status` = 'checkpoint';
    5.  
    6. SELECT *, DATE_FORMAT(`db_profile`.`date_create`, '%d.%m.%Y') AS `date`,
    7.             COUNT(`db_profile`.`id`) AS `count`,
    8.             (SELECT COUNT(`db_profile`.`status`) FROM `db_profile` WHERE `status` = 'checkpoint') AS `count_status_checkpoint`
    9.             FROM db_profile, `my_profile` AS `t1`
    10.             WHERE `db_profile`.`date_create` >= '2021-01-28' AND `db_profile`.`date_create` <= ('2021-02-03' + INTERVAL 1 DAY)
    11.             GROUP BY DATE_FORMAT(`db_profile`.`date_create`, '%d.%m.%Y'), count_status_checkpoint
    12.             ORDER BY `db_profile`.`date_create` DESC;
    13.            
    14. DROP TEMPORARY TABLE my_profile;
    # MySQL вернула пустой результат (т.е. ноль строк). О_о
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Код (Text):
    1. SELECT `tablename`.`chtoto`, `t1`.`eschochtoto`
    2. FROM `tablename`, (SELECT `tablename`.`chegototam` FROM `tablename`) AS `t1`
    3. WHERE `tablename`.`chegototam` = `t1`.`chegototam`
    4. AND `tablename`.`chegototam` = 123;
     
    AlexProg нравится это.
  10. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Опечатка или я не пойму о чём речь!?
    Таблица то одна tablename

    Смысл?
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Смысл - выбрать строки отвечающие одному условию в отдельную таблицу.
    Объединить с первой по какому-то условию.
    Сгруппировав по какой-то колонке далее.
    Это предположение. Помочь не могу - мало данных в тестовой таблице.
     
  12. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Сколько добавить?
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Штук по десять на день. Как с днями рождения, так и без.
    И, желательно, образец желаемого вывода.
    Посмотрим что там можно сделать.
     
    AlexProg нравится это.
  14. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Готово! https://www.db-fiddle.com/f/eWrLmWNSfN1JHL1NLS7Jbv/1 Там 80 записей.
    От 04.02.2021 до 28.01.2021

    Важно только role и date_create. Остальное можно не обращать внимания.

    Вывод (последние 7 дней, т.е. только 7 строк):
    | 04.02.2021 (date_create) | Количество Admin (role) 4 | Количество Moder (role) 6 | Количество Vasya (role) 4 |
    | 03.02.2021 (date_create) | Количество Admin (role) 3 | Количество Moder (role) 4 | Количество Vasya (role) 5 |
    ...
    | 29.01.2021 (date_create) | Количество Admin (role) 2 | Количество Moder (role) 3 | Количество Vasya (role) 1 |
     
  15. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Потестим. Не знаю когда будет результат. Сейчас немного занят.
     
  16. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Очень жду!

    Если нужно оплачу кофе :)

    P.S. Первому кто решит задачу!
     
    #16 AlexProg, 4 фев 2021
    Последнее редактирование: 4 фев 2021
  17. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Предварительно получается вот так:
    Код (Text):
    1.  
    2. SELECT `role`, COUNT(`id`) AS `count`, DATE(`date_create`) as `date_create`
    3. FROM `db_profile`
    4. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    5. FROM `db_profile`
    6. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    7. GROUP BY `role`, DATE(`date_create`)
    Если не совсем то, завтра еще попробую.
     
    AlexProg нравится это.
  18. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Работает как мой вариант. Выводит все верно, кроме количества по дню в role
    Сколько в день вась, админов и модераторов.
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вот часть выводимого за три дня
    Код (Text):
    1.  
    2. Moder    1    2021-01-28
    3. Vasya    2    2021-01-28
    4. Admin    7    2021-01-28
    5. Vasya    1    2021-01-29
    6. Moder    2    2021-01-29
    7. Admin    7    2021-01-29
    8. Vasya    2    2021-01-30
    9. Admin    7    2021-01-30
    10. Moder    1    2021-01-30
    Админов столько-то, модеров столько-то плюс Васи.
    Что не так?
    Нужна одна строка - одна дата?
    В принципе наверное можно, но это будет, скорее всего в одной колонке, и вам потом это придется разбирать или с помощью explode, или регулярным выражением.
     
    #19 Drunkenmunky, 5 фев 2021
    Последнее редактирование: 5 фев 2021
    AlexProg нравится это.
  20. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Да :)
     
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Так:
    Код (Text):
    1. SELECT GROUP_CONCAT(`t1`.`newrole` SEPARATOR ' + ') AS `concat`, `t1`.`date_create`
    2. FROM (SELECT CONCAT(`role`, '(', COUNT(`id`), ')') AS `newrole`, DATE(`date_create`) as `date_create`
    3. FROM `db_profile`
    4. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    5. FROM `db_profile`
    6. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    7. GROUP BY `role`, DATE(`date_create`) ) AS `t1`
    8. GROUP BY `t1`.`date_create`
    сойдет?
    Вывод:
    Код (Text):
    1. Admin(7) + Vasya(1) + Moder(2)    2021-01-29
    2. Vasya(2) + Moder(1) + Admin(7)    2021-01-30
    3. Vasya(1) + Moder(2) + Admin(7)    2021-01-31
    4. Moder(2) + Admin(6) + Vasya(2)    2021-02-01
    5. Moder(2) + Admin(4) + Vasya(2)    2021-02-02
    6. Moder(2) + Admin(8) + Vasya(2)    2021-02-03
    7. Moder(2) + Admin(6) + Vasya(2)    2021-02-04
     
    AlexProg нравится это.
  22. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Пока не могу на сервере запустить.
    SELECT *, GROUP_CONCAT... нужны остальные поля. Так ошибка.

    `t1`.`id` - так тоже Unknown column 't1.id' in 'field list'
     
  23. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Потому, что в t1 нет такой колонки
     
    AlexProg нравится это.
  24. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Жаль!

    Без GROUP_CONCAT и CONCAT нальзя?
    Не могу отформатировать как мне нужно. (обычная таблица - 1 значение на 1 клетку) Сейчас всё в одной строке и вася и админ (
     
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Можно.
    Смотрите предыдущий вариант. Где одна дата - три строки.
    Их проще разобрать.
    Выводите сначала в ассоциативный массив, где корневой ключ дата, а потом уже его подаете на вывод..
     
    AlexProg нравится это.