1

次の表の対応する REVID を使用して、各 NID の最後の「VERSION」を取得したいと考えています。

+------+-------+-----+---------+----------+
| RHID | REVID | NID | VERSION |  ACTION  |
+------+-------+-----+---------+----------+ 
| 1    |   1   |  1  |    1    |  CREATE  |
+------+-------+-----+---------+----------+  
| 2    |   2   |  2  |    1    |  CREATE  |
+------+-------+-----+---------+----------+  
| 3    |   3   |  1  |    2    |  UPDATE  |
+------+-------+-----+---------+----------+  
| 4    |   4   |  1  |    3    |  UPDATE  |
+------+-------+-----+---------+----------+  
| 16   |   3   |  1  |    4    | ROLLBACK |
+------+-------+-----+---------+----------+

私が実行すると:

SELECT a.nid, a.revID, MAX(a.version)
FROM `revision_history` a
GROUP BY a.nid; 

結果は次のようになると思います。

+-----+-------+---------+
| NID | REVID | VERSION |
+-----+-------+---------+
|  1  |   3   |    4    |
+-----+-------+---------+
|  2  |   2   |    1    |
+-----+-------+---------+

代わりに、結果は次のとおりです。

+-----+-------+---------+
| NID | REVID | VERSION |
+-----+-------+---------+
|  1  |   3   |    4    |
+-----+-------+---------+
|  2  |   2   |    4    |
+-----+-------+---------+

Q. 期待する結果を得るために適切なクエリは何ですか?

ノート:

これは、ビューを構築するためのものです (MySQL ではサブクエリをサポートしていません)。

4

2 に答える 2

2

これを試して:

select a.nid ,a.revID ,a.version
from   `revision_history` a
JOIN
      (SELECT nid,  MAX(version) as version
        FROM `revision_history` 
        GROUP BY nid)b
ON    a.nid=b.nid
AND   a.version=b.version

SQL フィドルのデモ

于 2012-11-22T12:42:19.787 に答える
1

GROUP BY私は常にが の最初の値を取ると仮定することを好みますFROM:

SELECT nid ,revID ,version
FROM (  SELECT nid, revID, version
        FROM `revision_history`
        ORDER BY version DESC) AS h
GROUP BY nid

メソッドは非常に短く、動作を知っていて、複数のケースを取得しない場合は、理解しやすく編集も簡単です。何らかの理由で同じ に 2 つの同一バージョンがある場合nid、結果が間違っている可能性があります。

于 2012-11-22T12:50:30.000 に答える