1

私はこれを持っています:

    $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)....

問題: 1-2-5 のみが IN LIST 句に一致する ID 1-2-3-4-5 のリストを送信した場合、リスト内のすべてを返す必要があり、リストに一致しないものについては null 値.

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

1 に答える 1

5

次のように外部結合ステートメントを生成します。

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。そうすれば、id は常に表示され、対応する行が table_live に存在する場合にのみ moderation_date が表示されます。

別のアプローチは、クエリをそのままにして、結果を配列に保存し、配列をphpでマージして、すべてのキーを保持し、両方の配列でキーが一致する場所にのみ値を入力することです.

使用している db ライブラリの種類がよくわからないので、結果セットの配列を取得する方法がわかりませんが、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

于 2012-04-19T14:03:00.773 に答える