Zend_Db api を使用して次のクエリをコーディングしようとしています。
select * from tableA where id not in (select pid from tableB where x =46 and y='participated');
これを機能させるために、次のコードを書きました。
最初に、tableB から配列形式で pid のリストを取得しています。
$select = $this->select()
->from(array('tb' =>'tableB'), array('mylist' => new Zend_Db_Expr('group_concat(tb.pid)' )))
->where('x = ?', $xval) //$xval is coming as 46
->where('type = ?', 'participated');
$result = $this->getAdapter()->fetchAll($select);
error_log("Result of query1 is " . print_r($result, true));
//Convert to array
$mylistArr = preg_split('/,/' , $result[0]['mylist'], PREG_SPLIT_NO_EMPTY);
error_log("value of mylistArr is " . print_r($mylistArr, true));
//Now get the results from tableA
$selectta = $this->select()
->setIntegrityCheck(false)
->from(array('ta' => 'tableA'), array('ta.id', 'ta.first_name', 'ta.last_name'))
->where('ta.id not in (?)', $mylistArr[0]);
$result = $this->fetchAll($selectta);
error_log("db query result is " . print_r($result, true));
さて、問題はこれです: 形成される最終的なクエリは
SELECT `ta`.`id`, `ta`.`first_name`, `ta`.`last_name` FROM `tableA` AS `ta` WHERE (ta.id not in ('197,198,199,200,106,201,202,204,203,205'))
ただし、クエリを次のようにしたい (つまり、tableB の ID のリストを引用符で囲まないでください)。
SELECT `ta`.`id`, `ta`.`first_name`, `ta`.`last_name` FROM `tableA` AS `ta` WHERE (ta.id not in (197,198,199,200,106,201,202,204,203,205))
その理由は、IN 句で逆コンマが渡されると、最初の ID、つまり 197 だけが結果をフィルタリングするために取得されるためです。
どんな助けでも本当に感謝しています。
ありがとう