如果未使用MySQL IN语句从数组中找到匹配项,则返回0

时间:2019-06-29 07:01:32

标签: php mysql arrays wordpress

我知道有很多类似的问题和答案,但是在这种情况下它们都不起作用,因为我正在使用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”]。如何防止$ reacts查询跳过未找到的项目,而是使其输出为0?

我尝试在各种变体中使用COALESCEIFNULLSUM,但得到的结果相同,但不为零。

这是SQL Fiddle,您可以使用它:

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您无需对查询进行复杂化,只需稍微更改应用程序(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;
}