2

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 だけが結果をフィルタリングするために取得されるためです。

どんな助けでも本当に感謝しています。

ありがとう

4

3 に答える 3

2

彼らが ZEND を使用しているこのサイトを見て、選択してください... どこで.. イン...

Zend DB を使用して MySQL の IN 句を実行するには?

それがどうなるか教えてください。

于 2012-06-13T18:45:42.730 に答える
1

これを実装する1つの方法を見つけました。しかし、これが最善の方法かどうかはわかりません。次のクエリを変更しました。

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

に:

  $selectta = $this->select()
    ->setIntegrityCheck(false)
    ->from(array('ta' => 'tableA'), array('ta.id', 'ta.first_name', 'ta.last_name'))
    ->where('not find_in_set(ta.id , ?)', $mylistArr[0]);

そしてそれは私に適切な結果を与えます。

この答えを改善するための提案は大歓迎です。

于 2012-06-13T18:46:12.667 に答える
1

preg_split を使用する代わりに、explode を使用して、カンマ区切りの文字列を where IN 句に渡すことができる ID の配列に変換する必要がありました。

以下は、私が行った最終的な実装です。

 $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 = explode(",", $result[0]['mylist']);
    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);

    $result = $this->fetchAll($selectta);
    error_log("db query result is " . print_r($result, true));
于 2012-06-13T18:59:18.340 に答える