我有一个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,所以我感到困惑,为什么它不起作用。任何帮助都非常感激
答案 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')
您仍然需要coalesce
。 left join
有意义
答案 1 :(得分:0)
尝试使用nullif
COALESCE(nullif(max(account_logins.created_at),''), 0)