Использование $ this-> db-> like () в Codeigniter возвращает неверные / пропущенные результаты - PullRequest
5 голосов
/ 10 мая 2011

У меня есть существующий 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 = "гонконг", я получу только одно из "Гонконгского кафе", а не оба.

Еще один озадачивает меня еще больше!Есть ряд под названием «Дозо».Когда $ 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 Ответ

3 голосов
/ 10 мая 2011

Исходя из вашего фактического запроса, ваш offset начинается с 1 вместо 0, поэтому он будет игнорировать первую запись (со смещением 0).

Так для дела:

Еще один озадачивает меня еще больше! Есть ряд под названием «Дозо». когда $ term = 'dozo', результат не возвращается!

Очевидно, ничего не будет возвращено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...