Rails,Postgres仅显示所有搜索参数中存在的项目[重复]

问题描述 投票:1回答:1

如果某些年份之间存在于商店,我只想抓住销售记录。我如何才能最好地实施此搜索?

例如,用户选择2013年的开始年份和2016年的结束年份以及商店名称。该商店选择出售香蕉和苹果,但该商店仅在2013年,2014年和2016年销售苹果。我希望我的结果仅显示香蕉的平均销售额,因为苹果在2015年没有销售。

到目前为止,我有以下查询:

@sale_averages = Sale.joins(:shops, :items).where('extract(year from season_year) < ? AND extract(year from season_year) > ? ', params[:start_year], params[:end_year])
.where('shops.name = ?', params[:select_shop])
.select('items.name, AVG(sale.price) as price').group('shop.name')

只是不确定如何创建一个查询,只筛选出所有搜索参数(年份和商店)中的项目(或ID)。

架构

create_table "items", force: :cascade do |t|
 t.string "name"
end

create_table "sales", force: :cascade do |t|
 t.integer "shop_id"
 t.integer "item_id"
 t.date "season_year"
 t.decimal "price"
end

create_table "shops", force: :cascade do |t|
 t.string "name"
end
ruby-on-rails postgresql ruby-on-rails-5
1个回答
-1
投票

我这里没有安装postgres所以它可能需要一些修正,但这里的基本想法(至少我的基本想法)是生成一个年份列表,选择其中一年中的所有项目,然后比较计数:

WITH years AS (
  SELECT * FROM generate_series(start_year,end_year);
)

SELECT  years, COUNT(items.id) AS item_count 
WHERE items.season_year IN years GROUP_BY(item.id)
HAVING COUNT(years) = item_count
© www.soinside.com 2019 - 2024. All rights reserved.