2011-05-10 26 views
5

我有一個現有的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」,即。 (香港咖啡廳,香港咖啡廳,拉麪香港),我只會得到(香港咖啡廳,香港咖啡廳)退回。現在如果$ 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 

UPDATE

解決。它是一個將錯誤變量傳遞給LIMIT子句的分頁問題。謝謝!

+1

兩年與CodeIgniter和我莫名其妙地不知道你可以附加 - >命令以前的..我繼續做$ this-> db - > ...爲每個額外的案件.. +1,因爲我顯然吸;) – Atticus 2011-05-10 16:48:43

+0

你能發佈正在生成的實際SQL嗎? – 2011-05-10 16:48:51

+0

在主要帖子的底部發布了實際的SQL – Nyxynyx 2011-05-10 16:53:05

回答

3

從您的實際問題時,你offset從這樣它會忽略第一個記錄1而不是0開始(偏移量0)。

所以對於案例:

另外一個讓我爲難,更進一步! 有一排叫做'Dozo'。當 $ term ='dozo'時,沒有結果返回!

沒有什麼會明顯返回。

+0

是的,這是正確的:) – Nyxynyx 2011-05-10 18:50:06

相關問題