如何在锁定步骤中将筛选值列表应用于两列



让我们假设我有一个包含以下列和记录的表:

id shop_id product_id
1  1       1
2  1       2
3  2       1
4  2       3

当查询看起来像这样时,我想运行单个查询来获得ID 1和ID 4记录:

ShopProduct.where(shop_id: 1, product_id: 1).where(shop_id: 2, product_id: 3)

问题是当我尝试这样简化时:

ShopProduct.where(shop_id: [1,2], product_id: [1,3])

然后我得到三条记录,而不是预期的两条。

少数输入对的简单解决方案:ROW值:

SELECT *
FROM   "ShopProduct"
WHERE  (shop_id, product_id) IN ((1,1), (2,3));

相关:

  • ';其中(col1,col2(<(val1,val2('

如果您有两个要在";锁定步骤";,其他形式可能更快/更方便。类似:并行运行两个数组(在锁定步骤中(,然后加入:

SELECT *
FROM   unnest('{1,2}'::int[], '{1,3}'::int[]) t(shop_id, product_id)
JOIN   "ShopProduct" USING (shop_id, product_id);

函数unnest()有一个重载版本,它接受多个输入数组。参见:

  • 并行取消多个数组的名称

db<gt;小提琴这里

您可以使用或条件从rails 5 开始实现

ShopProduct.where(shop_id: 1, product_id: 1).or(ShopProduct.where(shop_id: 2, product_id: 3))

相关:

Rails使用一组散列查找记录

最新更新