За последние 24 часа нас посетили 22099 программистов и 1154 робота. Сейчас ищут 352 программиста ...

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

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

Метки:
  1. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Это?

    Код (Text):
    1. SELECT `role`, COUNT(`id`) AS `count`, DATE(`date_create`) as `date_create`
    2. FROM `db_profile`
    3. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    4. FROM `db_profile`
    5. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    6. GROUP BY `role`, DATE(`date_create`)

    Дело в том, что здесь у меня (и скрипт и phpmyadmin) выводит 1 строка = 1 дате. Всего 7 строк.
    На fiddle да, три строки на дату.

    UPDATE: Ошибся. Разбираюсь.
     
    #26 AlexProg, 5 фев 2021
    Последнее редактирование: 5 фев 2021
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это, да.
    Не знаю почему так.
    Судя по структуре исходной таблицы у вас версия mysql отличная от моей. MariaDB наверное.
    Там есть свои особенности.
     
  3. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Не извращение ли это?

    Код (Text):
    1.         $arrAll = [];
    2.         foreach ($res as $value) {
    3.             //var_dump($value);
    4.             foreach ($value as $k => $v) {
    5.                 if ($k == "date_create") {
    6.  
    7.                     $arrAll[$v] = [
    8.                         'role' => [
    9.                             "admin" => ($value["role"] == "admin") ? $value["count"] : '',
    10.                             "mod"    => ($value["role"] == "mod") ? $value["count"] : '',
    11.                         ],
    12.                         'count' => $value["count"],
    13.                     ];
    14.                    
    15.                 }
    16.                
    17.             }
    18.         }
    В общем хрень!

    Есть ещё варианты? :) Что бы сразу с базы корректно формировать.
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2.  
    3. $db_result = array(
    4. array('role' => 'Admin', 'count' => '7', 'date_create' => '2021-01-29'),
    5. array('role' => 'Moder', 'count' => '2', 'date_create' => '2021-01-29'),
    6. array('role' => 'Vasya', 'count' => '1', 'date_create' => '2021-01-29'),
    7. array('role' => 'Admin', 'count' => '7', 'date_create' => '2021-01-30'),
    8. array('role' => 'Moder', 'count' => '1', 'date_create' => '2021-01-30'),
    9. array('role' => 'Vasya', 'count' => '2', 'date_create' => '2021-01-30')
    10. );
    11.  
    12. $empty_element = array('Admin' => 0, 'Moder' => 0, 'Vasya' => 0);
    13.  
    14. $new_array = array();
    15.  
    16. foreach($db_result as $row)
    17. {
    18.   if(!isset($new_array[$row['date_create']])) $new_array[$row['date_create']] = $empty_element;
    19.  
    20. $new_array[$row['date_create']][$row['role']] =  $row['count'];
    21. }
    22.  
    23.  
    24. echo '<pre>';
    25. print_r($new_array);
    26.  
    27. foreach($new_array as $key => $value)
    28. {
    29. echo $key.': '.join(',',$value).'<br>';
    30. }
    31.  
    32. ?>
     
    AlexProg нравится это.
  5. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    @Drunkenmunky ёкмакарёк!

    Оно! Спасибо большое!
    Куда скинуть на обещанное кофе? :)
     
  6. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Закрывая, так сказать, тему, хочу заметить, что, собственно, в отдельных колонках всё это дело вывести таки можно.
    Но, запрос будет выглядеть довольно монструозно.
    Сейчас выдалась свободная минутка, вот, наваял:
    Код (Text):
    1. SELECT *
    2. FROM
    3. (SELECT COUNT(*) AS `count_admin`, DATE(`date_create`) as `date`
    4. FROM `db_profile`
    5. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    6. FROM `db_profile`
    7. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    8. AND `role` = 'Admin'
    9. GROUP BY `role`, `date`) AS `t1`,
    10. (SELECT COUNT(*) AS `count_moder`, DATE(`date_create`) as `date`
    11. FROM `db_profile`
    12. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    13. FROM `db_profile`
    14. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    15. AND `role` = 'Moder'
    16. GROUP BY `role`, `date`) AS `t2`,
    17. (SELECT COUNT(*) AS `count_vasya`, DATE(`date_create`) as `date`
    18. FROM `db_profile`
    19. WHERE DATE(`date_create`) IN (SELECT DISTINCT DATE(`date_create`)
    20. FROM `db_profile`
    21. WHERE `date_create` >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY))
    22. AND `role` = 'Vasya'
    23. GROUP BY `role`, `date`) AS `t3`
    24. WHERE `t1`.`date` = `t2`.`date`
    25. AND `t2`.`date` = `t3`.`date`
    Думаю, можно согласиться, что вариант "одна дата - три строки" куда симпатичней.
     
  7. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Думаю решающий фактор скорость.
    Нужно просто сравнить.

    В первом варианте приходится в цикле всё прогонять.

    В целом работает, ещё раз спасибо!
     
  8. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @AlexProg, агрегатные функции - не только count.
    Если уж заранее известны роли - можно и просуммировать количества :)
    Код (SQL):
    1. SELECT DATE(date_create), SUM(IF(ROLE = 'Admin', 1, 0)) AS cnt_Admin, SUM(IF(ROLE = 'Vasya', 1, 0)) AS cnt_Vasya, SUM(IF(ROLE = 'Moder', 1, 0)) AS cnt_Moder
    2. FROM db_profile
    3. WHERE DATE(`date_create`) >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
    4. GROUP BY DATE(date_create)
    PS: Функция date() использована потому, что в наборе данных для теста поле date_create содержит не только дату, но и время.
     
    AlexProg нравится это.