Возвращает 0, если в массиве не найдено совпадений с оператором MySQL IN - PullRequest
0 голосов
/ 29 июня 2019

Я знаю, что есть много похожих вопросов и ответов, но ни один из них не работает в этом случае, так как я использую оператор IN для получения совпадений из массива, а мои даты имеют тип данных varchar из-за его формат. Вот оно:

Я пытаюсь проверить, существуют ли элементы массива в базе данных, и получить количество для каждого из них в виде массива. Мой SQL-запрос работает нормально и получает результаты, но единственная проблема заключается в том, что я хочу, чтобы он возвращал 0 для элементов массива, которых нет в базе данных, вместо того, чтобы пропустить его.

Например, вот моя таблица базы данных:

postId   reactedTo   reactedDate
126      Like        22 Jun 2019
172      Haha        24 Jun 2019
172      Wow         27 Jun 2019
132      Like        27 Jun 2019

Вот моя функция для запуска SQL-запроса и получения результатов в виде массива

public function reactionsAnalytics() {
    global $wpdb;
    $tableName = $wpdb->prefix.'reactions';
    $dates = $this->getLastNDays(7); //array('22 Jun 2019', '23 Jun 2019', ... ,'28 Jun 2019');
    $reacts = $wpdb->get_results("
SELECT reactedDate, count(*) AS count
  FROM {$tableName} 
 WHERE reactedDate IN ('".implode("','", $dates)."')  
 GROUP 
    BY reactedDate
", ARRAY_A);

    $result = array();
    foreach ($reacts as $react) {
        $result[] = $react['count'];        
    }

    wp_die(json_encode($result));
}

Ожидаемый выход этой функции - ["1", "0", "1", "0", "0", "2", "0"], но я получаю ["1", "1", "2"]. Как я могу запретить запросу $ реагирует пропускать не найденные элементы и сделать вместо него 0?

Я пытался использовать COALESCE, IFNULL и SUM в различных вариантах, но получил те же результаты без нулей.

Вот SQL Fiddle, и вы можете играть с ним:

http://sqlfiddle.com/#!9/ffbb98/5

Спасибо!

1 Ответ

0 голосов
/ 29 июня 2019

Вместо того, чтобы усложнять запрос, вам просто нужно немного изменить код приложения (PHP). Получите результаты запроса для дат, доступных в БД. Теперь, в коде PHP, просто проверьте, доступно ли количество для даты или нет. Если да, используйте счетчик, иначе установите ноль.

// Change the SQL query result to an array with date as key, and count as value
$reacts_mod = array_combine(array_column($reacts, 'reactedDate'), 
                            array_column($reacts, 'count'));

// Now prepare the $result
$result = array();
// Loop over input dates here
foreach ($dates as $dt) {

    // If you have count obtained from the query result, then consider that else 0
    if ( isset($reacts_mod[$dt]) ) {
        $result[] = $reacts_mod[$dt];
    } else {
        $result[] = 0;
    }

    // Note: PHP7 code would be simply:
    // $result[] = $reacts_mod[$dt] ?? 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...