Как добавить несуществующую запись и вернуть ее с нулевым значением в Mysqli - PullRequest
0 голосов
/ 20 сентября 2019

ЗАПРОС:

 SELECT month(date_created), count(a.ticket_num) 
            FROM ticket as a 
            LEFT JOIN user_management as b on b.engineer_id = a.ticket_engineer 
            WHERE b.tl_id = 'sample_id'
            AND year(date_created) = '2019'
            GROUP BY extract(year from date_created), extract(month from date_created)

ВЫБОР ВЫБОРКИ:

  month | ticket_num
----------------------
    2   |     12
    4   |     24
    6   |     78

ВЫХОД ВЫБОР ОБРАЗЦОВ:

 month | ticket_num
----------------------
    1   |     0
    2   |     12
    3   |     0
    4   |     24
    5   |     0
    6   |     78

Как вы можете видеть выше ожидаемый результат, я пытаюсь поместить весь существующий месяц в первый столбец и установить все счетчики на ноль, если их не было во втором столбце.На данный момент у меня есть только запрос для сортировки количества заявок по месяцам, существовавший при создании заявки.

1 Ответ

0 голосов
/ 20 сентября 2019

Существуют разные подходы к этой проблеме.Например, чистый SQL .

Но я бы сказал, что решение на основе PHP проще.По сути, вам нужно поместить ваши данные в массив , затем создать цикл, который выводит желаемый порядок месяцев и имеет условие, которое определяет, есть ли у нас соответствующая строка в нашем массиве, и выводит в эфир фактические данные илиноль соответственно.

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

$sql = "SELECT month(date_created), count(a.ticket_num) ...";
$res = $mysqli($sql);
$data = [];
while($row = mysqli_fetch_row($res)) {
    $data[$row[0]] = $row[1];
}

Теперь $data - это массив, индексированный по номеру месяца.Все остальное - примитивный цикл

foreach (range(1,12) as $month) {
    echo $data[$month] ?: 0;
}

В дополнение к этому, я хотел бы рекламировать использование PDO, а не mysqli для взаимодействия с вашей базой данных, так как в этом случае ясно видно преимущество первого.Используя PDO, мы можем получить индексированный массив сразу, без явного цикла, благодаря специальному режиму выборки :

$sql = "SELECT month(date_created), count(a.ticket_num) ...";
$data = $data = $pdo->query($sql)->fetchAll(PDO::FETCH_KEY_PAIR);

Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...