2016-11-20 5 views
2

これについてHQL文を理解しようとしています。私は...グループ内のすべての製品注文の最新のステータスを取得しようとしているが、この作業を取得するための正しいHQLの構文を把握することができないようHQLの別の列でグループ化されたテーブルから最新の列を取得します

例テーブル:

id | created_at | group_id | purchase_id | status 
---|------------|----------|-------------|------------ 
0 | 10   | 3  | 6   | DELIVERING 
1 | 11   | 3  | 6   | DELIVERED 
2 | 12   | 3  | 7   | DELIVERING 
3 | 13   | 3  | 8   | DELIVERING 
4 | 14   | 4  | 13   | DELIVERING 
5 | 15   | 4  | 13   | DELIVERED 
6 | 16   | 4  | 13   | LOST 
7 | 17   | 5  | 17   | DELIVERING 

id | created_at | group_id | purchase_id | status 
---|------------|----------|-------------|------------ 
1 | 11   | 3  | 6   | DELIVERED 
2 | 12   | 3  | 7   | DELIVERING 
3 | 13   | 3  | 8   | DELIVERING 

クエリはPostgreSQLで動作します:

= 3.この表になるはずである各 purchase_id、の( created_atによる)最新の情報を取得します210
SELECT DISTINCT ON (o.purchase_id) * 
FROM orders o 
WHERE o.group_id = 3 
ORDER BY o.purchase_id, o.created_at DESC 

同等のHQLステートメントは何ですか?

答えて

1

created_atは、2つの「最新情報を有していてもよいpurchase_idの所与purchase_id(一つの値に対して一意でない場合created_at値はその後HQL以下

from Orders 
WHERE (purchase_id, created_at) 
     IN 
     ( SELECT purchase_id, max(created_at) 
      FROM Orders 
      GROUP BY purchase_id 
    ) 

を動作する必要があり、各purchase_id内で一意であることAssumming "レコードと同じ値のcreated_at)の場合は、より深いレベルのサブクエリが必要です。以下のHQLでは、最高値がcreated_atのレコードが1つだけ選択され、次にそれぞれidのレコードが選択されます。purchase_id(そのIDをassumming今回は主キーで、ユニークである):

from Orders 
WHERE id IN (
    SELECT max(id) from Orders 
    WHERE (purchase_id, created_at) 
     IN ( 
      SELECT purchase_id, max(created_at) 
      FROM Orders 
      GROUP BY purchase_id 
     ) 
    GROUP BY purchase_id 
) 
+0

申し訳ありませんが、私は、これは 'purchase_id'のグループごとに最新の取得方法を確認するために失敗していますか?私は最新のものが "最高"の 'created_at'値(または最高の' id')を持っているが、まだ 'purchase_id'でどのようにグループ化されているのか分かりません。 – justderb

+0

私は答えを更新しました。 – krokodilko

+0

ありがとう!私は最初のHQLステートメントを使用しましたが、 'WHERE ... IN()'句の後ろに 'AND o.group_id =?' – justderb

関連する問題