如何通過其屬性之一找到關聯表的最舊記錄過濾?

粉紅弗洛伊德90

我有模型Subscription,其has_many Version秒。

AVersion有一個status,plan_idauthorized_at日期。

對 a 所做的任何更改Subscription都來自Version更新其父級修改Subscription

我們的目標是找到每個認購的Version具有最早authorized_at日期WHEREversions.plan_id是一樣的subscriptions.plan_id(換句話說,我需要的授權日起Versionplan_id更改為當前Subscriptionplan_id)。

這是我提出的查詢。我在聚合函數語法中遇到錯誤:

syntax error at or near "MIN" LINE 3: MIN (authorized_at) from versions ^

詢問:

select subscriptions.id,
MIN (authorized_at) from versions
where versions.plan_id = subscriptions.plan_id
) as current_version
from subscriptions
join versions on subscriptions.id = versions.subscription_id
where versions.status = 'processed'

我也不確定是否應該將版本分組plan_id,然後從每個組中挑選。我有點失落。

最大限度

您可以使用橫向子查詢,最好將其描述為 SQL 中的 foreach 循環。它們是從單個相關記錄中選擇列或什至從一組相關記錄中選擇列的極其高效的方式。

對於訂閱中的每一行,數據庫將從authorized_at 訂購的版本中選擇一行:

SELECT "subscriptions".*,
       "latest_version"."authorized_at" AS current_version,
       "latest_version"."id" AS current_version_id -- could be very useful
FROM   "subscriptions" 
LATERAL
  (
     SELECT   "versions"."authorized_at", "versions"."id"
     FROM     "versions"
     WHERE    "versions"."subscription_id" = "subscriptions"."id" -- lateral reference
     AND      "versions"."plan_id" = "subscriptions"."plan_id"
     AND      "versions"."status" = 'processed'
     ORDER BY "versions"."authorized_at" ASC
     LIMIT 1
  ) latest_version ON TRUE

在 ActiveRecord 中創建橫向連接可以使用 SQL 字符串或 Arel 來完成:

class Subscription < ApplicationRecord
  # Performs a lateral join and selects the 
  # authorized_at of the latest version 
  def self.with_current_version
    lateral = Version.arel_table.then do |v|
      v.project(
        v[:authorized_at],
        v[:id] # optional
      ).where(
        v[:subscription_id].eq(arel_table[:id])
          .and(v[:plan_id].eq(arel_table[:plan_id]) )
          .and(v[:status].eq('processed'))
      )
      .order(v[:authorized_at].asc)
      .take(1) # limit 1
      .lateral('latest_version ON TRUE')
    end
    lv = Arel::Table.new(:latest_version) # just a table alias
    select(
      *where(nil).arel.projections, # selects everything previously selected
      lv[:authorized_at].as("current_version"),
      lv[:id].as("current_version_id") # optional
    ).joins(lateral.to_sql)
  end
end

如果您只想選擇idcurrent_version列,您應該考慮使用 pluck 而不是選擇沒有正確水合的數據庫模型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通過另一個數組屬性組合和過濾數組屬性

通過過濾掉其餘記錄來識別活動記錄的 SQL 查詢

通過匹配 id 屬性過濾數組

如何通過子 POJO 的屬性過濾複合多對多 POJO?

通過 nativescript background-http 插件發送負載,其屬性之一是數組

如何通過檢查另一個表中的記錄字段來查詢記錄?

使用屬性過濾數據,同時過濾屬性的聯合類型

關於如何通過 flex 屬性居中對齊的問題

是否可以通過某些屬性的值過濾嵌套對象?(JS)

通過表達式只獲取一組中的一條記錄

MySQL - 使用 SUM 過濾記錄

是否可以總結對像數組的屬性並根據另一個屬性對其進行過濾?

如何區分相似的 has_many :通過 Rails 中的關聯?

Angular - 如何通過過濾表中的索引更新表元素?

為什麼在 style 屬性中定義的這個內聯 SVG 過濾器不起作用?

過濾我需要檢查多個屬性以檢查它們是否包含數組中的字符串之一的對象

如何在 Django 過濾器表單中從相關模型中過濾用戶的名字

如何使用 AND 運算符過濾 ADO 記錄集

elasticsearch:使用匹配過濾掉記錄

laravel 過濾器返回所有記錄

如何通過另一個數組編號鍵過濾數組鍵

如何通過元組枚舉過濾集合

如何通過pk過濾刪除模型

MySql 將表與表之一的過濾器連接起來

如何使用計算屬性和道具過濾對象 [VueJS]

如何在javascript中過濾嵌套對象屬性並打印新對象

過濾具有特定屬性的活動

根據來自 S3 的記錄過濾來自 Redshift 的記錄

如何通過查詢集獲取最新記錄。喜歡分組