Модель Ecto - подзапрос в выборе

Мне нужно сделать этот SQL-запрос с Ecto:

SELECT users.*, (select count(0) from money_transactions where from_id = users.id AND created_at > '2016-1-25 0:00:00.000000') as money_transactions_today_db FROM "users" WHERE "users"."client_token" = '123'

Я пытаюсь сделать что-то вроде этого, но это не работает:

query = from users in Like4uElixir.User,
        where: users.client_token in ^tokens,
        select: {users, (from money_transactions in Like4uElixir.MoneyTransaction,
                            where: money_transactions.from_id == users.id,
                            select: count(0))}

Поддерживает ли Ecto подзапросы? Если нет, то как я могу выполнить запрос?


person Denis Kuznetsov    schedule 25.01.2016    source источник


Ответы (1)


Вы можете использовать фрагменты запроса:

query = from users in Like4uElixir.User,
        where: users.client_token in ^tokens,
        select: {users, (fragment("(SELECT COUNT(0) FROM money_transactions
                                    WHERE money_transactions.from_id == ?)", users.id))}

Хотя в этом случае запрос можно написать и с помощью обычных объединений и group_by. Текущая поддержка подзапросов в Ecto ограничена.

person José Valim    schedule 26.01.2016
comment
К сожалению, это не работает: (Postgrex.Error) ОШИБКА (syntax_error): синтаксическая ошибка в SELECT или рядом с ним. Я закончил делать запрос с помощью JOIN & GROUP BY, как вы упомянули. - person Denis Kuznetsov; 26.01.2016
comment
Извините, вам нужны скобки вокруг SELECT ... во фрагменте. Я обновил свой ответ. - person José Valim; 27.01.2016