Rails-SQL-联接和COALESCE

时间:2019-04-11 11:46:15

标签: mysql sql ruby-on-rails ruby

我有一个account表和一个account_logins表。我试图选择每个帐户,然后按其上次登录时间对其进行排序。到目前为止,我有以下内容:

accounts
  .confirmed_visible_with_completed_profile
  .joins(:logins)
  .select('accounts.*, max(account_logins.created_at) as last_sign_in_at')
  .group('accounts.id')

这有效,但是,如果一个帐户没有与之关联的account_logins,则不会在查询中返回该帐户。我的SQL很差,但是我通过谷歌搜索发现了COALESCE,并尝试过:

accounts
  .confirmed_visible_with_completed_profile
  .joins(:logins)
  .select('accounts.*, COALESCE(max(account_logins.created_at), 0) as last_sign_in_at')
  .group('accounts.id')

但是,在没有account_login关联的情况下,这仍然不会返回记录。根据我的阅读,如果max(account_logins.created_at)为NULL,COALESCE(max(account_logins.created_at), 0)应该返回0,所以我感到困惑,为什么它不起作用。任何帮助都非常感激

2 个答案:

答案 0 :(得分:2)

您错过了连接部分中的那些值,因此coalesce中的select在这种情况下是无用的。 select是最后应用的操作。您需要left join才能解决问题

在滑轨5中,您有left_joins

accounts
  .confirmed_visible_with_completed_profile
  .left_joins(:logins)
  .select('accounts.*, COALESCE(max(account_logins.created_at), 0) as last_sign_in_at')
  .group('accounts.id')

在滑轨5之前

accounts
  .confirmed_visible_with_completed_profile
  .joins("LEFT JOIN account_logins ON accounts.id = account_logins.account_id")
  .select('accounts.*, COALESCE(max(account_logins.created_at), 0) as last_sign_in_at')
  .group('accounts.id')

您仍然需要coalesceleft join有意义

答案 1 :(得分:0)

尝试使用nullif

COALESCE(nullif(max(account_logins.created_at),''), 0)