代码之家  ›  专栏  ›  技术社区  ›  DollarChills

rails,postgres仅显示所有搜索参数中的项目

  •  0
  • DollarChills  · 技术社区  · 5 年前

    如果某个商店里有几年的销售记录的话,我只想查一下。我怎样才能最好地实现这个搜索?

    例如,用户选择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
    
    0 回复  |  直到 5 年前
        1
  •  -1
  •   B.G.    5 年前

    我在这里没有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