Nyx*_*nyx 5 php mysql sql activerecord codeigniter
我有一个现有的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);
Run Code Online (Sandbox Code Playgroud)
但是现在我想通过在上面添加一行来为查询添加一个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);
Run Code Online (Sandbox Code Playgroud)
但它给了我不准确的结果.例如,当我让字符串被搜索时$ term ="hong"而我有3行,其中'name'列匹配"hong"即.(香港咖啡厅,香港咖啡厅,拉面红),我只会(香港咖啡厅,香港咖啡厅)退货.现在,如果$ term ="hong kong",我只回来了一个'香港咖啡馆'而不是两个.
另一个让我更进一步困惑!有一排叫做"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
Run Code Online (Sandbox Code Playgroud)
UPDATE
解决了.它是一个将错误的变量传递给LIMIT子句的分页问题.谢谢!
从您的实际查询开始,您的查询是从而不是这种方式offset开始,它将忽略第一条记录(位于 offset )。 100
所以对于这个案例来说:
还有一个更让我困惑!有一行称为“Dozo”。当$term = 'dozo'时,没有返回结果!
显然什么都不会被返回。
| 归档时间: |
|
| 查看次数: |
5360 次 |
| 最近记录: |