За последние 24 часа нас посетили 5409 программистов и 694 робота. Сейчас ищут 198 программистов ...

count() вернуть пустые значения если результат не найдет.

Тема в разделе "Laravel", создана пользователем sowelanes, 2 июл 2017.

Метки:
  1. sowelanes

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

    С нами с:
    11 дек 2014
    Сообщения:
    100
    Симпатии:
    0
    Добрый день.
    Есть запрос в ларе который возвращает сумму записей за промежуток, в моем случае за неделю. Запрос :

    PHP:
    1. Stats::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek(),])
    2.             ->where('ac_status', $status)
    3.             ->selectRaw('DATE_FORMAT(created_at, "%Y-%m-%d") as date')
    4.             ->selectRaw('COUNT(order_id) as '. $status)
    5.             ->groupBy('date')
    6.             ->get();
    Сейчас результат возвращает только те дни в которых count != 0. Мне необходимо что бы возвращались все дни сгрупированные по дате даже с нулевыми значениями.
    Пробовал добавлять условие
    Код (Text):
    1. ->havingRaw("COUNT(order_id) >= 0")
    Результат такой же, с тестовыми данными возвращает за 7 дней - две записи.
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.714
    Симпатии:
    615
    Можете написать запрос на SQL?
     
  3. sowelanes

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

    С нами с:
    11 дек 2014
    Сообщения:
    100
    Симпатии:
    0
    Вот:

    Код (Text):
    1. SELECT DATE_FORMAT(created_at, "%Y-%m-%d") as date, COUNT(order_id) as holds FROM stats WHERE ac_status = 'hold' AND created_at BETWEEN '2017-06-28' AND '2017-07-02' GROUP BY date;
    Результат получаю сгрупировано только по тем датам где count отличный от нуля, а хочу получить все, даже с нулями

    Результат моего запроса:

    2017-06-29 - 4
    2017-06-30 - 2

    Ожидаемый результат:

    2017-06-28 - 0
    2017-06-29 - 4
    2017-06-30 - 2
    2017-06-31 - 0
    2017-07-01 - 0
     
    #3 sowelanes, 2 июл 2017
    Последнее редактирование: 2 июл 2017
  4. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Если Mysql, то наиболее простой вариант создать вспомогательную таблицу с датами и делать с ней JOIN.
    Если Postgres, то там есть функция generate_series с которой тоже нужно организовать JOIN.
     
  5. sowelanes

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

    С нами с:
    11 дек 2014
    Сообщения:
    100
    Симпатии:
    0
     
  6. sowelanes

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

    С нами с:
    11 дек 2014
    Сообщения:
    100
    Симпатии:
    0
    У меня мускуль. Один момент не очень понятен. Это таблица со статистикой следующей структуры:
    которая содержит исчерпывающую информацию сама по себе, разве вариант когда дата дублируется в отдельную таблицу простой?
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.714
    Симпатии:
    615
    Дык вот, проблема в том, что запрос - верный, просто вы почему то ожидаете, что у вас появятся строки с нулевыми значениями. Откуда? Их ведь изначально нет. Добавить их можно создав временную таблицу или серию, как выше написал @t1grok

    И да, к Laravel это не относится ни каким боком )