Php 使用$this->;db->;Codeigniter中的like()返回错误/缺失的结果

Php 使用$this->;db->;Codeigniter中的like()返回错误/缺失的结果,php,mysql,sql,codeigniter,activerecord,Php,Mysql,Sql,Codeigniter,Activerecord,我有一个现有的SQL查询,可以按照我的要求完美地运行: $this->db->select('places.*, category.*') ->select('COUNT(places_reviews.place_id) AS num_reviews') ->select('(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popula

我有一个现有的SQL查询,可以按照我的要求完美地运行:

$this->db->select('places.*, category.*')
            ->select('COUNT(places_reviews.place_id) AS num_reviews')
            ->select('(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating')
            ->from('places')
            ->join('category', 'places.category_id = category.category_id')
            ->join('places_reviews', 'places_reviews.place_id = places.id', 'left')
            ->join('places_popularity', 'places_popularity.place_id = places.id', 'left')
            ->where('places.category_id', $category_id)
            ->group_by('places.id')
            ->limit($limit, $offset)
            ->order_by($sort_by, $sort_order);
但是,现在我想在查询中添加一个LIKE子句,在上面添加一行以获得:

$this->db->select('places.*, category.*')
            ->select('COUNT(places_reviews.place_id) AS num_reviews')
            ->select('(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating')
            ->from('places')
            ->join('category', 'places.category_id = category.category_id')
            ->join('places_reviews', 'places_reviews.place_id = places.id', 'left')
            ->join('places_popularity', 'places_popularity.place_id = places.id', 'left')
            ->where('places.category_id', $category_id)
                            ->like('places.name', $term)
            ->group_by('places.id')
            ->limit($limit, $offset)
            ->order_by($sort_by, $sort_order);
然而,它给了我不准确的结果。例如,当我让字符串被搜索为$Ne==“HUN”时,我有3行“名称”列匹配“Hang-Ie”(香港咖啡馆,香港咖啡馆,Ramen Hong),我只会得到(香港咖啡馆,香港咖啡馆)返回。现在,如果$term=“hong kong”,我只返回一个“hong kong Cafe”,而不是两个

另一个更让我困惑!有一行叫做“Dozo”。当$term='dozo'时,不返回任何结果

知道为什么会这样吗

实际生成的SQL 抱歉,它出现在1行中

SELECT `places`.*, `category`.*, COUNT(places_reviews.place_id) AS num_reviews, (places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating FROM (`places`) JOIN `category` ON `places`.`category_id` = `category`.`category_id` LEFT JOIN `places_reviews` ON `places_reviews`.`place_id` = `places`.`id` LEFT JOIN `places_popularity` ON `places_popularity`.`place_id` = `places`.`id` WHERE `places`.`category_id` = 1 AND `places`.`name` LIKE '%Dozo%' GROUP BY `places`.`id` ORDER BY `average_rating` desc LIMIT 1, 3
更新


解决了。这是一个分页问题,它将错误的变量传递给LIMIT子句。谢谢

从实际查询中,您的
偏移量
1
开始,而不是
0
,这样它将忽略第一条记录(在偏移量
0

因此,就本案而言:

另一个更让我困惑! 有一行叫做“Dozo”。什么时候 $term='dozo',不返回任何结果


显然不会返回任何内容。

使用CodeIgniter两年,我不知何故不知道您可以将->命令附加到以前的命令中。。我一直在做$this->db->。。。每增加一个案例+1因为我显然很差劲;)@阿提卡斯:那不是Codeigniter,那只是php。通过在方法中返回对象,可以链接方法。您确定要查询的字段的
places.category_id=1
为真吗?否则,没有什么会立即跳出来。@Atticus:关于这个问题,许多方法都会这样做,正如您在OP的代码中看到的那样。当然不是“全部”,比如返回结果。只需查询生成器函数即可。@Atticus: