我可以使用SUBSTR从mysqli数据库中选择数据来优化查询

时间:2014-09-30 11:34:08

标签: php sql pdo mysqli substring

我正在尝试使用精简工具在我的网站上进行搜索。我坚持的位是按开始字母搜索。例如,我可以使用通配符'%X%'但他会归还任何包含字母' x的内容。 我在几个网站上读到可以在mysql查询中使用SUBSTRING

http://dev.mysql.com/

http://www.kirupa.com/

https://stackoverflow.com/questions/6302027

这是我到目前为止所做的一切,但没有任何回报。数据库中的数据应随查询一起返回。

public function refineUsersFollowers($user_id,$q){
    if($this->databaseConnection()){
        // get the users followers
        $state = array(1,2);
        $stmt = $this->db_connection->prepare("SELECT * FROM friends WHERE id_2 = :1 AND Friend_Request_State = :2 OR id_2 = :3 AND Friend_Request_State = :4");
        $stmt->bindParam(':1',  $user_id);
        $stmt->bindParam(':2',  $state[0]);
        $stmt->bindParam(':3',  $user_id);
        $stmt->bindParam(':4',  $state[1]);
        $stmt->execute();
        // format the SQL OR statements
        $sql = '';
        $ids = [];
        while($rows = $stmt->fetch(\PDO::FETCH_ASSOC)){
            array_push($ids,$rows['id_1']);
        }

        for($x = 0; $x < count($ids); $x++){
            if(count($ids) == 1){
                //if there is one result
                $sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x;
            }else if($x == (count($ids) - 1)){
                // last entry
                $sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x;
            }else{
                //continue loop
                $sql.= ' user_id = :'.$x." AND SUBSTRING('first_name',0,1) = :".$x.$x." OR";
            }
        }
        $stmt = $this->db_connection->prepare("SELECT * FROM account WHERE ".$sql);
        for($x = 0; $x < count($ids); $x++){
            $stmt->bindParam(':'.$x,$ids[$x]);
            $insert = $x.$x.'';
            $stmt->bindParam(':'.$insert,$q);
        }
        $stmt->execute();
        $results = $stmt->fetch(\PDO::FETCH_ASSOC);
        print_r($results);
        // check for followers that start with letter
    }
}

函数的第一部分很好,这会得到一个id的数组,然后将它们作为SQL字符串放在一起。 SQL是否未返回结果,因为不支持SUBSTRING? 如果有这样的方法可以产生这样的查询,或者更容易从数据库中提取每个结果,那么在另一个函数中检查它们?

2 个答案:

答案 0 :(得分:2)

此表达式有两个问题:

SUBSTRING('first_name', 0, 1) = :".$x.$x;

首先,SQL中的substr()(一般情况下)从1开始计数而不是0.因此,第一个参数应为1.

其次,你在单引号中有第一个参数。所以,充其量,这将返回字母'f'。这是一个简单的规则:只对字符串和日期常量使用单引号。切勿使用单引号来引用列名。

有几种方法可以写出你想要的东西。这是三个:

SUBSTRING(first_name, 1, 1) = $x
LEFT(first_name, 1) = $x
first_name like '$x%'

答案 1 :(得分:0)

使用LIKE运算符可以大大简化查询。这样:

"AND SUBSTRING('first_name',0,1) = :".$x.$x;

可以成为:

"AND first_name LIKE '".$x.$x."%'";

我不确定$x.$x的用途是什么,所以我只是为了说明目的而将其保留下来。