让我们假设我有一个包含以下列和记录的表:
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使用一组散列查找记录