6

私はこのようなテーブルを持っています:

      table: searches
+------------------------------+
| id  |   address   |   date   |
+------------------------------+
| 1   | 123 foo st  | 03/01/13 |
| 2   | 123 foo st  | 03/02/13 |
| 3   | 456 foo st  | 03/02/13 |
| 4   | 567 foo st  | 03/01/13 |
| 5   | 456 foo st  | 03/01/13 |
| 6   | 567 foo st  | 03/01/13 |
+------------------------------+

そして、次のような結果セットが必要です。

+------------------------------+
| id  |   address   |   date   |
+------------------------------+
| 2   | 123 foo st  | 03/02/13 |
| 3   | 456 foo st  | 03/02/13 |
| 4   | 567 foo st  | 03/01/13 |
+------------------------------+

しかし、ActiveRecord はこの結果を達成できないようです。これが私が試していることです:

  • モデルには「most_recent」スコープがあります:scope :most_recent, order('date_searched DESC')
  • Model.most_recent.uniq完全なセット ( ) を返します。SELECT DISTINCT "searches".* FROM "searches" ORDER BY date DESC明らかに、クエリは私が望んでいることを実行しませんが、1 つの列だけを選択することもありません。すべての列が必要ですaddressが、結果セットで一意の行のみが必要です。
  • のようなこともできますModel.select('distinct(address), date, id')が、それは...間違っていると感じます。
4

2 に答える 2

3

あなたはすることができます

select max(id), address, max(date) as latest 
       from searches 
       group by address 
       order by latest desc

私があなたが望むと思うことを正確に行うsqlfiddleによると。

これは、どの ID が返されるかを気にしていないように見える、要件の出力とはまったく同じではありません。それでも、クエリは何かを指定する必要があります。これは、ここでは "max" 集計関数によって行われます。

この場合、ActiveRecord の自動生成されたクエリ メソッドでうまくいくとは思えません。したがって、その SQL を使用する独自のクエリ メソッドをモデル クラスに追加するだけです。これは、基本的に他のすべての RDBMS でも実行される完全に標準的な SQL です。

編集:クエリの大きな弱点の 1 つは、実際のレコードが返されるとは限らないことです。特定のアドレスの最高 ID がそのアドレスの最高日付と一致しない場合、結果の「レコード」は実際に DB に格納されているものとは異なります。ユースケースに応じて、重要かどうか。Mysqlの場合、変更max(id)するだけidでその問題は解決しますが、IIRC Oracleには問題があります。

于 2013-03-21T13:51:14.510 に答える