Невозможно преобразовать операторы SQL (использует предложение HAVING и временную таблицу) в обычный искатель запросов .find Rails. - PullRequest
2 голосов
/ 12 мая 2010

Я не могу заставить следующий 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.

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