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

标签 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_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);

但是它给我的结果不准确。例如,当我让正在搜索的字符串 $term = "hong"时,我有 3 行,其中 'name' 列与 "hong"匹配,即。 (Hong Kong Cafe, Hong Kong Cafe, Ramen Hong),我只会得到(Hong Kong Cafe, Hongkong Cafe)返回。现在,如果 $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 子句的分页问题。谢谢!

最佳答案

根据您的实际查询,您的 offset 是从 1 而不是 0 开始的,这样它会忽略第一条记录(在 offset 0)。

所以对于这种情况:

Another one puzzles me even further! There is a row called 'Dozo'. When $term = 'dozo', no result is returned!

显然不会返回任何内容。

关于php - 在 Codeigniter 中使用 $this->db->like() 会返回错误/缺失的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953449/

相关文章:

java - OpenSSL 解密返回 false

php - 如何全天将系统中的线索平均分配给两方?

mysql - 在 Django 中处理本地和远程数据库

php - 如何将数据写入另一台服务器上的数据库表?

PHP - 路径操作/输入验证

php - 动态链式选择框

sql - 将 SQL 查询转化为 ActiveRecord Relation

c# - 通过objectset插入多条记录

java - Hibernate 相当于 getTimestamp() 和 getInt()

php - 加入查询问题 - codeigniter