数据库
首页 > 数据库> > MySQL SELECT WHERE IN LIST和NOT IN LIST在同一SQL中

MySQL SELECT WHERE IN LIST和NOT IN LIST在同一SQL中

作者:互联网

我有这个:

    $ids = "1,2,3,4,5";
    $sqlQuery = "SELECT id, moderation_date
                    FROM table_live
                    WHERE id IN (".$ids.")";

    $q = $this->CI->db->query($sqlQuery);

    if($q->num_rows() > 0) {
        foreach ($q->result() as $row) {
            $arr[] = $row;
        }
    }

    return $arr;

如果所有ID都存在于table_live中,这将很好地工作
然后返回

           array([id] => 1 [moderation_date] => 2012-04-11 12:55:57)....

问题:如果我发送ID列表1-2-3-4-5,其中只有1-2-5与IN LIST子句匹配
我需要返回列表中的所有内容,而那些与列表不匹配的则为空值.

           array([id] => 3 [moderation_date] => null) 

解决方法:

生成一个外部连接语句,以便获得:

SELECT ids.id, table_live.moderation_date
FROM (select 1 id union all select 2 union all ....) ids
LEFT JOIN table_live
ON ids.id = table_live.id

其中ids是枚举所有值的子查询,如下所示:

$ids = '1,2,3,4,5'
$subquery = 'select '.str_replace(',', ' id union all select ', $ids).''
$sql = "SELECT ids.id, table_live.moderation_date
FROM ($subquery) ids
LEFT JOIN table_live
ON ids.id = table_live.id"

确保选择ids.id,而不是table_live.id.这样,仅当table_live中存在相应的行时,id才会始终显示,并且显示moderation_date.

另一种方法是保持查询不变,将结果存储在数组中,然后在php中合并数组,以便保留所有键,并仅在两个数组中的键均匹配的情况下填写值.

我不太确定您使用的是哪种类型的数据库库,因此我不知道如何获取结果集的数组,但是假设您将使用id的字符串表示形式将行存储在php数组中键,并将日期作为值,那么此代码应能解决问题:

$items = array(
    '1' => NULL
,   '2' => NULL
,   ...
); 
//note: use string keys in order to merge!!
$result = array_merge($items, $resultset);

查看:http://php.net/manual/en/function.array-merge.php

标签:arrays,mysql,select,where-in
来源: https://codeday.me/bug/20191010/1885079.html