【发布时间】:2015-05-26 21:25:50
【问题描述】:
我的原始 SQL 查询是:
DB.fetch(' SELECT
p.project_name,
p.project_id,
COUNT(i.expense_project_id) AS item_count,
SUM(COALESCE(amount,0)) AS item_amount
FROM expense_projects p
LEFT JOIN expense_items i ON p.project_id = i.expense_project_id
WHERE p.project_company_id = ?passed_param
GROUP BY p.project_id, p.project_name').to_a.to_json
如何使用 Sequel ORM 编写此查询?
我后来找到了一个解决方案,如下所示。我之前做过很多努力,当我发布这个问题时,我应该包括我失败的努力之一,抱歉!在这里回答:
DB[:expense_projects___p].where(:project_company_id=>user_company_id).
left_join(:expense_items___i, :expense_project_id=>:project_id).
select_group(:p__project_name, :p__project_id).
select_more{count(:i__item_id)}.
select_more{sum(:i__amount)}.to_a.to_json
【问题讨论】:
-
欢迎来到 Stack Overflow。在询问有关找出如何做某事的问题时,您通常会提供至少一个您尝试过的代码示例,并说明为什么它不能满足您的需求。如果不这样做,就好像你没有尝试过,只是希望有人为你写,这不是我们在这里所做的。我建议将您解决问题的尝试添加到问题中。另外,你在 Sequel 邮件列表或 IRC 频道上问过这个吗?
-
谢谢,是的,我已经多次尝试,明天我会发布最接近的版本。我理解你的意思,如果我无意中似乎在滥用社区,我深表歉意。
-
想一想:您的查询已经在 SQL(一种用于与数据库交互的通用行业标准语言)中工作 - 将其翻译成另一种特定于领域的语言是否会提高可读性、性能或可维护性代码?
-
使用 ORM 的好处是它意味着查询变得更容易移植。相同的逻辑适用于 SQLite、MySQL、PostgreSQL、Oracle 等。纯 SQL 是可移植的,但大多数 DBM 需要特定于供应商的扩展来做任何利用 DBM 特性的事情。减少尽可能多的供应商特定代码是一件好事。我使用 SQLite 对想法进行本地测试,然后在我们的开发/测试主机上使用 PostgreSQL 或 MySQL。我们目前将 PostgreSQL 用于我们的生产系统,但很高兴我们可以在 Oracle DB 中使用相同的代码,而无需更改代码。
-
@user1903663,请将您的解决方案移动到答案中,而不是在您的问题中。 Stack Overflow 需要一个宽限期到期才能选择答案,但我建议您在找到解决方案后这样做。
标签: ruby postgresql sequel