2015-06-09 4 views
0

My SQL запроса являетсяВложенный запрос в Rails без использования find_by_sql

SELECT MAX(sale_money) 
FROM (
    SELECT SUM(sale_money) sale_money 
    FROM sales 
    WHERE MONTH(created_at) = 5 
    GROUP BY user_id 
) t 

Я пишу подзапрос в Rails 4 кода:

record = Sale.select("SUM(sale_money) AS sale_money").where("MONTH(created_at) = 5").group(:user_id) 

Кто-то может научить меня построение запросов к max_record на основе record, или другой запрос, кроме max_record = Sale.find_by_sql(my_raw_sql) или max_record = Sale.where(my_raw_sql)

ответ

1

Да, то же самое можно сделать с использованием метода Activerecord form.

Sale.from(Sale.select("SUM(sale_money) AS sale_money") 
       .where("MONTH(created_at) = 5") 
       .group(:user_id), :t 
     ) 
    .select("MAX(t.sale_money) as sale_money") 

Но, вы можете сделать, как:

Sale.select("SUM(sale_money)") 
    .where("MONTH(created_at) = 5") 
    .group(:user_id) 
    .order("SUM(sale_money) DESC") 
    .limit(1) 

выше один не нужен 2 ВЫБРАТЬ запросов.

+0

2-й запрос работает. Первый может быть неправильным. Rails анализирует неправильный SQL-запрос: 'SELECT' sales'. * FROM Sale.where ("MONTH (created_at) = 5"). Select ("SUM (sale_money) AS sale_money"). Group (: user_id) '. Спасибо – user4557573

+0

@ user4557573 попробуйте сейчас .. –

+0

Arup Rails понимают '' Sale.select ("SUM (sale_money) AS sale_money") .where ("MONTH (created_at) = 5") .group (: user_id) '' как строка. Таким образом, он анализирует ваш код: SELECT MAX (t.sale_money) AS sale_money FROM Sale.select («SUM (sale_money) AS sale_money»). Где («MONTH (created_at) = 5»). Group (: user_id) ' – user4557573

Смежные вопросы