Я не могу заставить следующий SQL-запрос работать правильно в Rails. Он запускается, но не выполняет часть «HAVING row_number = 1», поэтому я получаю все записи, а не только первую запись из каждой группы. Краткое описание запроса: он находит предложения отелей по различным критериям и, в частности, определяет их приоритетность, а затем выбирает наиболее выгодный. Таким образом, если есть платная сделка (и), сначала будет взята самая высокая из них (по сделке), если нет платных сделок, то будет самая высокая сделка по неоплаченной сделке для каждого отеля. Использование MAX (dealrank) или чего-то подобного не работает как способ выделить первый ряд каждой группы отелей, поэтому у меня есть прилагаемый temptable и создание столбца row_number. Обратите внимание, этот запрос работает правильно при запуске непосредственно в MySQL. Вот запрос:
SELECT *,
@num := if(@hid = hotel_id, @num + 1, 1) as row_number,
@hid := hotel_id as dummy
FROM (
SELECT hotel_deals.*, affiliates.cpc,
(CASE when affiliates.cpc > 0 then 1 else 0 end) AS paid
FROM hotel_deals
INNER JOIN hotels ON hotels.id = hotel_deals.hotel_id
LEFT OUTER JOIN affiliates ON affiliates.id = hotel_deals.affiliate_id
WHERE ((hotel_deals.percent_savings >= 0) AND
(hotel_deals.booking_deadline >= ?))
GROUP BY hotel_deals.hotel_id, paid DESC, hotel_deals.dealrank ASC) temptable
HAVING row_number = 1
В настоящее время я использую для этого Rails 'find_by_sql', хотя я также пытался поместить его в обычную находку, используя: select,: from и: имея части (но: имея не привыкну, если вы есть: группа). Если есть другой способ написания этого запроса, это тоже было бы полезно знать.
Я использую Rails 2.3.5, MySQL 5.0.x.