2016-05-23 13 views
0

Rails Active Record Query Interfaceを使用して以下の簡単なSQLを書く方法を理解できないようです。Rails 4 Query Interface 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句の外側には1つの列しか指定しませんが、2つが必要です。

リンク:どのような援助のためのsubqueries in activerecord

感謝。

モデル

[ProductSale]

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

[ProductLocation]

UPDATEの関係

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

私のDBはMySQLのであることに注意してください。

+3

提供してくださいお使いのモデルの関係、ちょうど必要と私の質問を更新し、関連するテーブル –

+0

用ANSスキーム:クエリは次の通りであるため、単純な1対多の関係クエリを使用し、その要求のためのand条件に参加しますinfo、ありがとう。 – add

答えて

1

私は代替案を持っている、product_location_idにuniqの行を選択するためにDISTINCT ON使用し

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") 
MySQLの

のためにハイからロー

net_saleをソート

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") 
について

を試してみてください

+0

ありがとうございますが、これには多少の誤差があります。 'ON'句はMySQLでは動作しません。しかし、私はMySQLを使用しているとは言いませんでした。また、選択項目の2つの列の間にカンマがありません。 エラーが発生していないので、出力はグループ化されていません。私はまだ繰り返しproduct_location_idのすべての行を取得しています。 もう一度おねがいしますが、他の提案もあります。 – add

+0

aw、大丈夫です。その場合、group byに戻ることができます。product_salesテーブルにidフィールドがありますか? – lusketeer

+0

ああそうです。レールによって追加される標準プライマリキー。 – add

0

さて、最初の部分

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

ありがとう。しかし、コードを使ってレールにエラーが発生しています。エラー:未定義のメソッド 'and'。あなたは偶然、特定の宝石を使っていますか? – add

+0

@add no、完全なエラーテキストを提供 –

+0

@add try upad –