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添加额外的WHERE语句,而不是OR.

有什么办法可以作为一个选择吗?或者我应该执行 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.'%"'
);

当您创建 sql 包括 AND 时,哪个效果更好:

从 Y 中选择 X,其中 A = AAA 并且(B = BBB 或 C = CCC 或 D = DDD)

于 2010-03-25T12:08:46.703 回答