2016-05-23 2 views
0

Я не могу понять, как написать следующий простой SQL, используя Rails Active Record Query Interface.Rails 4 Интерфейс запроса WHERE IN

SELECT * 
FROM product_sales 
WHERE (product_location_id, net_sale) 
IN 
( 
    SELECT product_location_id, MAX(net_sale) 
    FROM product_sales 
    GROUP BY product_location_id 
) 
AND (sale_date BETWEEN '2016-05-01' AND '2016-05-31'); 

Примечание: я просмотрел следующую ссылку. Однако он определяет только один столбец во внешнем предложении WHERE, тогда как мне нужно два.

Ссылка: subqueries in activerecord

Спасибо за любую помощь.

ОБНОВЛЕНИЕ

Модели

[ProductSale]

references :product_location, index: true, foreign_key: true 
decimal :net_sale, precision: 16, scale: 6 
date :sale_date 

[ProductLocation]

references :product, index: true, foreign_key: true 
etc... 

Отношения

ProductSale -> belongs_to :product_location 
ProductLocation -> has_many: product_sales 

Пожалуйста, обратите внимание, мой DB находится в MySQL.

+3

пожалуйста обеспечивают вашу модель отношений, анс схему для связанных таблиц –

+0

Просто обновленных мой вопрос искомых информация, спасибо. – add

ответ

1

У меня есть альтернативное предложение, попробуйте

Для Postgresql

ProductSale 
     .select("DISTINCT ON (product_sales.product_location_id), product_sales.*") 
     .where("product_sales.sale_date BETWEEN '2016-05-01' AND '2016-05-31'") 
     .order("product_sales.product_location_id, product_sales.net_sale DESC") 

Используйте DISTINCT ON, чтобы выбрать Uniq строку на product_location_id отсортированный net_sale от высокой к низкой

Для MySQL

sub_query = ProductSale.select("product_location_id, MAX(net_sale) as max_net_sale").where("sale_date BETWEEN '2016-05-01' AND '2016-05-31'").group("product_location_id").to_sql 
ProductSale 
     .joins("INNER JOIN (#{sub_query}) t ON product_sales.product_location_id = t.product_location_id AND product_sales.net_sale = t.max_net_sale") 
+0

Спасибо, но в этом есть некоторые незначительные ошибки. Предложение «ON» не работает в MySQL. Но я не упоминал, что я использую MySQL, так что плохо. Кроме того, между двумя столбцами в элементе отсутствует запятая. С ошибками в сторону, выход не сгруппирован или «отличен», как мы надеялись, что важно. Я все еще получаю все строки с повторяющимися product_location_id. Еще раз спасибо, я открыт для любых других предложений. – add

+0

aw, ладно, в этом случае мы можем вернуться на группу, у вашей таблицы product_sales есть поле id? – lusketeer

+0

ах да. Стандартный первичный ключ, добавленный рельсами. – add

0

Ну, первая часть для запроса заключается в следующем, просто использовать простое отношение запрос один ко многим, затем присоединяется and условия для запроса:

ProductSale 
    .where(net_sale: ProductSale.pluck("MAX(net_sale)")) 
    .and("sale_date BETWEEN ? AND ?", date1, date2) 
    .where.not(product_location_id: nil) 
    .group(:product_location_id) 
+0

Спасибо. Тем не менее, я получаю сообщение об ошибке с использованием рельсов с использованием кода. Ошибка: неопределенный метод 'и'. Вы случайно используете конкретный камень? – add

+0

@add нет, укажите полный текст ошибки –

+0

@add try upaded –