1

我是数据库新手,但我觉得我想做的事情应该很常见......

我想要实现的是允许用户对我的网站为他们获取的结果应用价格范围过滤器和价格排序。所以我想找到指定价格范围内的所有价格,然后按价格排序。

我有一个在 Heroku 上运行的 Hasura DB。数据库有两个表,seeds并且prices. 表中的一行seeds,即一个种子,可以与prices表中的多行,即多个价格相关联。它们由外键约束和一对多关系或对象到数组连接。

我正在尝试seeds使用以下 GraphQL 查询进行查询:

{
  seeds(
    where: {prices: {price: {_gte: "10", _lte: "200"}}}, 
    order_by: {prices_aggregate: {min: {price: asc_nulls_last}}}
  ) {
    product_name
    prices {
      price
    }
  }
}

我想要这个查询做的是过滤掉所有prices.price不在有效范围内的(10, 200)东西,然后prices.price按升序对它们进行排序。然而,结果是通过prices.price升序排列不在范围内的 INCLUDING 值,然后过滤结果。

我将举一个例子来澄清。考虑上述查询的以下结果:

{
  "data": {
    "seeds": [
      {
        "product_name": "Northern Lights Auto Feminised Seeds",
        "prices": [
          {
            "price": 3.48
          },
          {
            "price": 6.79
          },
          {
            "price": 9.58
          },
          {
            "price": 104.5
          }
        ]
      },
      {
        "product_name": "The White OG Feminised Seeds",
        "prices": [
          {
            "price": 3.48
          },
          {
            "price": 6.79
          },
          {
            "price": 15.68
          }
        ]
      },
      {
        "product_name": "Special Kush #1 Feminised Seeds from Royal Queen Seeds",
        "prices": [
          {
            "price": 3.49
          },
          {
            "price": 13.53
          },
          {
            "price": 8.29
          }
        ]
      }
    ]
  }
}

prices.price上面的结果是正确的,因为在分别指定的范围内都有有效的值(104.5, 15.68, 13.53),但是结果的顺序不正确。相反,它们按最低排序price.prices,而与指定的过滤器无关(10, 200)

结果的正确顺序是:

{
  "data": {
    "seeds": [
      {
        "product_name": "Special Kush #1 Feminised Seeds from Royal Queen Seeds",
        "prices": [
          {
            "price": 3.49
          },
          {
            "price": 13.53
          },
          {
            "price": 8.29
          }
        ]
      },
      {
        "product_name": "The White OG Feminised Seeds",
        "prices": [
          {
            "price": 3.48
          },
          {
            "price": 6.79
          },
          {
            "price": 15.68
          }
        ]
      },
      {
        "product_name": "Northern Lights Auto Feminised Seeds",
        "prices": [
          {
            "price": 3.48
          },
          {
            "price": 6.79
          },
          {
            "price": 9.58
          },
          {
            "price": 104.5
          }
        ]
      }
    ]
  }
}

谁能帮助我,并解释我如何才能达到这些正确的结果?值得一提的是,查询后无法对结果进行排序,因为有数千个,排序肯定会影响从数据库返回的结果。

提前致谢!

4

1 回答 1

1

您应用于种子的 where 子句将获取在您指定的范围内具有至少一个价格的所有种子。这不会过滤price您在嵌套查询中获取的数据。

要过滤价格,您需要在价格数组关系中应用 where 子句。

{
  seeds(
    where: {prices: {price: {_gte: "10", _lte: "200"}}}, -> this filters seeds
    order_by: {prices_aggregate: {min: {price: asc_nulls_last}}}
  ) {
    product_name
    prices(where:{price:{_gte: "10", _lte: "200"}}) { -> this filters price
      price
    }
  }
}
于 2019-09-20T10:47:08.617 回答