2011-05-10 9 views
5

tengo una consulta SQL existente que funciona perfectamente como lo quiero:

$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); 

Sin embargo ahora quiero añadir un COMO cláusula a la consulta agregando una línea más a la de arriba para obtener:

$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); 

Sin embargo me está dando resultados inexactos. Por ejemplo, cuando dejo que la cadena sea buscada $ term = "hong" y tengo 3 filas donde la columna "nombre" coincide con "hong", es decir. (Café de Hong Kong, Café de Hong Kong, Ramen Hong), solo conseguiré (Café de Hong Kong, Café de Hong Kong) devuelto. Ahora bien, si $ term = "hong kong", solo obtengo uno de los 'Hong Kong Cafe' devueltos y no los dos.

¡Otra me desconcierta aún más! Hay una fila llamada 'Dozo'. Cuando $ term = 'dozo', ¡no se devuelve ningún resultado!

¿Alguna idea de por qué sucede esto?

SQL real generado sentimos que aparece en la línea 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 

ACTUALIZACIÓN

resuelto. Es un problema de paginación que pasa la variable incorrecta a la cláusula LIMIT. ¡Gracias!

+1

dos años con CodeIgniter y de alguna manera no sabía que se pueden agregar -> comandos a los anteriores .. Sigo haciendo $ this-> db -> ... para cada caso adicional .. +1 porque aparentemente soy una mierda ;) – Atticus

+0

¿Se puede publicar el SQL real que se está generando? –

+0

Publicado el SQL actual en la parte inferior de la publicación principal – Nyxynyx

Respuesta

3

Desde su consulta real, su offset está empezando a partir 1 en lugar de 0 esta manera la ignorará el primer registro (en el desplazamiento 0).

Así que para el caso:

Otro me desconcierta aún más! Hay una fila llamada 'Dozo'. Cuando $ term = 'dozo', no se devuelve ningún resultado.

Nada será devuelto obviamente.

+0

Sí, esto es correcto :) – Nyxynyx

Cuestiones relacionadas