2011-01-09 8 views
0

私の例では、私はこれのように書くでしょう。SQL:最新のクロスエントリを選択するには?

私はテーブル呼び出しマップを持っています。 (simplyfied)このようなエントリがあります。

ID,TITLE,MAP,VERSION. 

今私は3つのマップを挿入します。

INSERT INTO maps VALUES(1,'MAP1','some blob stuff',1); 
INSERT INTO maps VALUES(2,'MAP2','some blob stuff',1); 
INSERT INTO maps VALUES(3,'MAP1','some blob stuff',2); 

今私は二回1つのマップが、2つの異なるバージョンを得ました。

どのようにすれば、それぞれの最新のマップのみを選択することができますか?それでは、MAP1 vers 2とMAP2 vers 1だけを表示しますか?

+0

どのデータベースを使用していますか? SQL Server/MySQL? – Chandu

+0

私はMySQLを使用しています。そして、私はちょうどこれがうまく動作しないと思った。GROUP BY ..?実際には、実際にも許可されています。 –

答えて

2
SELECT M1.* 
FROM maps M1 
WHERE M1.version = (SELECT MAX(M2.version) FROM maps M2 WHERE M2.title = M1.title) 

いますが、GROUP BY

SELECT M1.id, M1.title, M1.map, MAX(M1.version) 
FROM maps M1 
GROUP BY M1.title 

EDITを避けるために必要とする理由私は表示されません - 指摘したように、この2番目のクエリは、最初の

+0

返されるマップの列の値が、MAX(バージョン)の行の値であることが保証されていないためです。 –

+0

どの質問にこの問題があると思いますか? –

+0

第2のもの。グループから集計値を取得することはできますが、特定の行から「マップ」列の値(このクエリのデータ)を取得することはできません。集計されていないすべての列がGROUP BYに含まれていない限り、多くのRDBMSはGROUP BY問合せを許可しません。 MySQLは、集計されていない列に未定義の値を持ちます。 –

0
で、適切なIDとマップの値を保証固執カント
SELECT * FROM maps m1 WHERE NOT EXISTS 
    (SELECT * FROM maps m2 WHERE m2.title = m1.title AND m2.version > m1.version) 
関連する問題