【问题标题】:Ecto Model - subquery in selectEcto 模型 - 选择中的子查询
【发布时间】:2016-01-28 00:45:29
【问题描述】:

我需要用 Ecto 进行这个 SQL 查询:

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 是否支持子查询?如果没有,我该如何执行查询?

【问题讨论】:

    标签: phoenix-framework ecto


    【解决方案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 中对子查询的支持是有限的。

    【讨论】:

    • 不幸的是它不起作用:(Postgrex.Error)错误(syntax_error):“SELECT”处或附近的语法错误。正如你提到的,我用 JOIN & GROUP BY 完成了查询。
    • 抱歉,片段中的 SELECT ... 周围需要括号。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多