2012-04-19 64 views
0

我有這樣的:MySQL的SELECT凡在列表中而不在同一個SQL LIST

$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; 

這僅僅是工作的罰款,如果在table_live 存在的所有ID和返回

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

問題:如果我發送一個列表1-2-3-4-5,其中只有1-2-5匹配IN LIST子句 我需要返回列表中的所有列表,並且這些列表不匹配列表中的空值。

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

請提供樣本數據和所需的輸出。 – RedFilter 2012-04-19 13:55:55

+0

如果所有不存在的id都將'moderation_date'設置爲'NULL',則可以在分配'$ arr []'時使用它' – hjpotter92 2012-04-19 13:58:28

回答

4

產生外,讓你得到連接語句:

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中合併數組,然後在PHP中合併數組,以便保留所有密鑰並僅在密鑰匹配陣列。

我不確定你正在使用什麼樣的數據庫庫,所以我不知道如何獲得結果集的數組,但是假設你已經將行存儲在一個php數組中,使用字符串表示形式ID作爲鍵,日期值,那麼這段代碼應該做的伎倆:

$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

+0

謝謝,Roland。我喜歡你的方法,但我有一個SQL錯誤:'字段列表'中的未知列'ids.id'SELECT ids.id,table_live.moderation_date FROM(SELECT 1-2-4-5-11-26-31)ids LEFT JOIN table_live ON ids.id = table_live.id $ ids是一個字符串,不是表 – 2012-04-19 14:30:20

+1

正確的,問題是生成的子查詢沒有列別名。現在修復。 – 2012-04-19 14:42:19

+0

你是個天才。非常感謝! – 2012-04-19 14:48:06

相關問題