1

計算を実行し、計算値に条件を適用し、結果をすべて 1 つのクエリでカウントしようとしています。問題は、条件から計算フィールドを参照する方法がわからないことです。

Issues.created_on フィールドがあり、ユーザーが指定した範囲の週に毎週作成された問題の数に関する統計を検索したいと考えています。これは、私のクエリがMySqlでどのように見えるかです:

mysql>  SELECT status_id as group_id,
YEAR(created_on)*1000+WEEK(created_on,1) as range_value, count(*) as
noOfEntries FROM `issues` WHERE (`issues`.`project_id` IN (1))  GROUP
BY issues.status_id, range_value;

+----------+-------------+-------------+
| group_id | range_value | noOfEntries |
+----------+-------------+-------------+
|        1 |     2012031 |           2 |
|        5 |     2012015 |           1 |
+----------+-------------+-------------+

これが私のコードです(簡略化):

# Range value is dynamic: "YYYYXXX", where YYYY is year and XXX could be week, month or day of year
range_value = "YEAR(created_on)*1000+WEEK(created_on,1)"    
select = "#{range_value} as range_value, count(*) as noOfEntries"
grouping = "range_value"
# other conditions are provided by user, so we just add one here
conditions["range_value"] = range[:min]..range[:max]

rows = Issue.all(:select => select, :conditions => conditions, :readonly => true, :group => grouping)

しかし、私はこのエラーが発生します:

ActiveRecord::StatementInvalid (Mysql::Error: Unknown column 'issues.range_value' in 'where clause': SELECT YEAR(created_on)*1000+WEEK(created_on,1) as range_value, 'weeks' as range_type, count(*) as logged_hours, 1 as entries, 'priority_id' as grouping, issues.priority_id as group_id FROM `issues` WHERE (`issues`.`range_value` BETWEEN '2012012' AND '2012031' AND `issues`.`project_id` IN (1))  GROUP BY range_value, issues.priority_id ORDER BY 1 asc, 6 asc):

変更しようとしているコードは私のものではないため、Issue オブジェクトに新しいフィールドやメソッドを追加できません。したがって、このような解決策は私にはうまくいかないと思います。

4

2 に答える 2

0

これを行う必要があります:

rows = Issue.select(select).where(conditions).group(grouping).readonly

それはより明確です。

于 2012-08-04T15:42:38.510 に答える
0

実際に役立つコードの例を見つけました:

ActiveRecord には、データベース クエリに HAVING 句を含めるためのパラメーターがありません。幸いなことに、find_by_sql() 呼び出しに頼る必要なく、:group パラメーターの最後に忍び込むことができます。(私は GROUP BY なしで HAVING を使用したことを覚えていませんが、そうすることが理にかなっている場合もあります。)

例として、データベース内の重複する電子メール アドレスをすべて検索する、Rails アプリケーションの 1 つからのクエリを次に示します。

duplicates = User.find( :all,
  :select     => "email, COUNT(email) AS duplicate_count",
  :conditions => "email IS NOT NULL AND email != ''",
  :group      => "email HAVING duplicate_count > 1"
)

したがって、わずかな変更を加えた後、私のコードは機能します:

# Range value is dynamic: "YYYYXXX", where YYYY is year and XXX could be
# week, month or day of year
range_value = "YEAR(created_on)*1000+WEEK(created_on,1)"    
select = "#{range_value} as range_value, count(*) as noOfEntries"
# CHANGED THIS LINE from: grouping = "range_value"
grouping = " HAVING range_value BETWEEN #{range[:min]} AND #{range[:max]}"

# other conditions are provided by user, so we just add one here
# REMOVED THIS LINE
# conditions["range_value"] = range[:min]..range[:max]

rows = Issue.all(:select => select, :conditions => conditions, :readonly => true, :group => grouping)
于 2012-08-05T05:33:27.737 に答える