2

次のSQLステートメントを作成しようとしています。

SELECT `users_table`.*, `users_data`.`first_name`, `users_data`.`last_name`
FROM `users_table`
INNER JOIN `users_data` ON users_table.id = user_id
WHERE (users_table.username LIKE '%sc%')
OR (users_data.first_name LIKE '%sc%')
OR (users_data.last_name LIKE '%sc%')

現在、次のコードがあります。

public function findAllUsersLike($like) {
    $select = $this - > select(Zend_Db_Table::SELECT_WITH_FROM_PART) - > setIntegrityCheck(false);
    $select - > where('users_table.username LIKE ?', '%'.$like.'%');
    $select - > where('users_data.first_name LIKE ?', '%'.$like.'%');
    $select - > where('users_data.last_name LIKE ?', '%'.$like.'%');
    $select - > join('users_data', 'users_table.id = user_id', array('first_name', 'last_name'));
    return $this - > fetchAll($select);
}

これは近いですが、の代わりにステートメントANDを追加するために使用するため、正しくありません。WHEREOR

1つの選択としてこれを行う方法はありますか?または、3つの選択を実行して結果を組み合わせる必要がありますか(オーバーヘッドが大幅に増加しますか?)

PS$like過去のパラメーターはサニタイズされているので、上記のコードでのユーザー入力について心配する必要はありません。

4

3 に答える 3

4
public function findAllUsersLike($like) {
    $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)->setIntegrityCheck(false);
    $select->orWhere('users_table.username LIKE ?', '%'.$like.'%');
    $select->orWhere('users_data.first_name LIKE ?', '%'.$like.'%');
    $select->orWhere('users_data.last_name LIKE ?', '%'.$like.'%');
    $select->join('users_data', 'users_table.id = user_id', array('first_name', 'last_name'));
    return $this->fetchAll($select);
}
于 2010-01-18T15:14:04.077 に答える
2

Zend_Db_Select には関数がありますorWhere。あなたはそれであなたの問題を解決できるはずです。

于 2010-01-18T15:14:03.397 に答える
-1

二重引用符 (") を使用して OR ステートメントをネストすることもできます。

$select->where('
users_table.username LIKE ' "%'.$like1.'%" '
OR users_data.first_name LIKE '"%'.$like2.'%" '
OR users_data.last_name LIKE '"%'. $like3.'%"'
);

AND も含めて SQL を作成すると、次のようにうまく機能します。

Y から X を選択します。ここで、A = AAA および (B = BBB または C = CCC または D = DDD)

于 2010-03-25T12:08:46.703 に答える