У меня есть существующий 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", мне вернут только одно из "Гонконгских кафе", а не оба.
Еще одна загадка меня еще больше озадачивает! Есть ряд под названием «Дозо». Когда $ term = 'dozo', результат не возвращается!
Есть идеи, почему это происходит?
Фактический сгенерированный SQL place_id) AS num_reviews ') - & ...
У меня есть существующий 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", мне вернут только одно из "Гонконгских кафе", а не оба.
Еще одна загадка меня еще больше озадачивает! Есть ряд под названием «Дозо». Когда $ term = 'dozo', результат не возвращается!
Есть идеи, почему это происходит?
Фактический сгенерированный SQL place_id) AS num_reviews ') - & ...
У меня есть существующий 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", мне вернут только одно из "Гонконгских кафе", а не оба.
Еще одна загадка меня еще больше озадачивает! Есть ряд под названием «Дозо». Когда $ 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. Спасибо!