Rails - SQL - соединения и COALESCE - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица счетов и таблица 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 через поиск в Google и попытался:

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. Из того, что я прочитал, COALESCE(max(account_logins.created_at), 0) должно возвращать 0, если max (account_logins.created_at) равно NULL, поэтому я запутался, почему это не работает. Любая помощь очень ценится

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Вы пропустили эти значения в части соединения, поэтому 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 имеет смысл

0 голосов
/ 11 апреля 2019

Попробуйте использовать nullif

COALESCE(nullif(max(account_logins.created_at),''), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...