Я знаю, что есть много похожих вопросов и ответов, но ни один из них не работает в этом случае, так как я использую оператор 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
Спасибо!