2017-11-11 5 views
-1

ありを注文したトランザクションごとのトランザクションIDとステータスを格納するテーブル「T」は次のとおりです。私は彼らの最高の状態との取引を取得する必要がありMySQLは彼らの最高の状態との取引を選択しても、IDの子孫によって

id  txn_id  status 
1  001   0 
2  001   2 
3  002   2 
4  002   0 
5  002   100 
6  003   0 
7  003   100 

もIDの子孫によって順序付け:

id  txn_id  status 
7  003   100 
5  002   100 
2  001   2 

をこれまでのところ、私が使用しています:

SELECT id, txn_id, status FROM 1a1_ipn GROUP BY txn_id ORDER BY id DESC 

しかし、運がない。私はアイデアが不足しています。あなたはこのような単一のクエリで所望の結果を達成することができます

答えて

1

を助けてください:

select t.id , x.txn_id, x.status 
from `1a1_ipn` t 
join (SELECT txn_id, max(status) as status FROM `1a1_ipn` 
    GROUP BY txn_id) as x on t.txn_id = x.txn_id and t.status = x.status 
order by id desc 
+0

これは機能します。これは、[特定の列のグループ単位の最大値を保持する行](https://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row)で説明されているオプションの1つです。 html)。 [SQL Fiddle](http://sqlfiddle.com/#!9/3bd0d9/16)を参照してください。 –

1

これは、データベースで作業する場合に遭遇する典型的な問題です。それを解決する方法はいくつかあります。 SQL Fiddle

SELECT t1.* 
FROM `1a1_ipn` t1     
LEFT JOIN `1a1_ipn` t2 ON t1.txn_id = t2.txn_id AND t1.status < t2.status 
WHERE t2.status is NULL 
ORDER BY id DESC 

ライブ例:I以下

は、最も効率的であると考えられているLEFT JOINアプローチを使用しました。

以下の技術は、非相関サブクエリを使用して、おそらくビットより直感的である:

SELECT * 
FROM (SELECT * FROM 1a1_ipn ORDER BY status DESC) AS s 
GROUP BY txn_id 
ORDER by id DESC 

SQL Fiddleにライブ例。

実行速度が問題になる場合は、サブクエリよりもLEFT JOINを記述する方が一般的です。

このテクニックおよびその他のテクニックの詳細については、The Rows Holding the Group-wise Maximum of a Certain Columnを参照してください。

+0

あなたが正しいところでは、私の解決策はこのような状況では正しくありませんでした。私は似たような要求に対してHAVINGを使ったことを覚えていますが、少なくともここではうまくいきません。ありがとうございました。 – spirit

+0

うわー!!!私は最初のものが好きです!私は最大値を得るためのテクニックとして覚えています:) MySQLとT-SQLの間のグループ化の違いはたくさんあります。マイクロ$ oft – Radu

+0

また、SQL Fiddleにも感謝します:) – Radu

関連する問題