Ruby中的优化(快速)ActiveRecord等价物是什么:
SELECT DISTINCT customers.city
FROM customers
INNER JOIN (
SELECT c_id
FROM carts
WHERE shop_id = #{`shop_id`}
ORDER BY created_at DESC
LIMIT 1000 OFFSET 1000
) AS filtered_carts ON customers.id = filtered_carts.c_id;
注意:shop_id
是传递给查询/关联的ruby变量。谢谢
上面的SQL运行得和预期的一样快。
我试图找到一个纯粹的ActiveRecord解决方案来避免类似这样的事情:
customers = Customer
.select(:city)
.distinct
.joins("
INNER JOIN (
SELECT c_id
FROM carts
WHERE shop_id = #{`shop_id`}
ORDER BY created_at DESC
LIMIT 1000 OFFSET 1000
) AS filtered_carts
ON customers.id = filtered_carts.c_id
")
原因是为了避免在ActiveRecord中硬编码SQL,以防止未来可能出现的最终模型更改和迁移的向后兼容性问题。
1条答案
按热度按时间utugiqy61#
我认为你根本不需要
JOIN
。where
中的子查询应该足够了:请注意,
customer_ids
只是一个ActiveRecord::Relation
,并且该查询不会立即运行。它只会在执行第二个查询时作为子查询运行。