【发布时间】:2014-11-12 19:22:06
【问题描述】:
我有一个相当复杂的查询,基本上是选择每个送货服务最便宜的送货服务价格。
为了获得每个交付服务的唯一记录,我使用了 SQL 中的DISTINCT 函数。此查询提供了正确的结果:
DeliveryServicePrice.active.select('DISTINCT ON (delivery_service_id) *').order('delivery_service_id, price ASC')
(仅查询的一部分)
然而,这个查询似乎只适用于 PostgreSQL(我认为这很奇怪,因为 PostgreSQL 对 SQL 标准更加严格);它不适用于 MySQL 和 SQLite。我收到以下错误:
Mysql2::Error: 你的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在 'ON (delivery_service_id) * FROM `delivery_service_prices` 附近使用 WHERE `delivery_servi' 在第 1 行:SELECT DISTINCT ON (delivery_service_id) * FROM `delivery_service_prices` WHERE `delivery_service_prices`.`active` = 1 AND (2808.0 >= min_weight AND 2808.0 = min_length AND 104.0 = min_thickness AND 104.0
我正在构建的应用程序是开源的,因此需要支持所有 3 种数据库类型。
如何在 Rails 框架语法中为 MySQL 和 SQLite 创建DISTINCT ON 查询?
我使用的是 Rails 4.1。
资源
我之前的问题供参考:
How to select unique records based on foreign key column in Rails?
File and line number for where the query is being used.
回答完毕
DeliveryServicePrice.select('delivery_service_prices.id').active.joins('LEFT OUTER JOIN delivery_service_prices t2 ON (delivery_service_prices.delivery_service_id = t2.delivery_service_id AND delivery_service_prices.price > t2.price)').where('t2.delivery_service_id IS NULL')
【问题讨论】:
-
DISTINCT * FROM delivery_service_id?
-
你试过了吗:
DeliveryServicePrice.active.distinct(:delivery_service_id).order('delivery_service_id, price ASC')? -
这个查询没有返回正确的结果,它只是返回所有的记录,因为没有 DISTINCT 条件。转换为:
SELECT DISTINCT 'delivery_service_prices'.* FROM 'delivery_service_prices' WHERE 'delivery_service_prices'.'active' = 1 ORDER BY delivery_service_id, price ASC
标签: mysql ruby-on-rails sqlite postgresql greatest-n-per-group