0

以下に示すようにデータベーステーブルを設定しました。

copy_blocks
id (auto-increment int)
content (text)
parent_id (int)

コピーが初めて挿入されるとき、parent_id はそれ自体に設定されます。例:

copy_blocks
id    content        parent_id
1     Hello, World   1

そのコピーがユーザーによって更新されると、新しい行が挿入されますが、それらの行は常にコピー ブロックの最初のバージョンを指します。

copy_blocks
id    content         parent_id
2     Hello, World!   1
3     Heya, World!!   1

このように構造化することで、コンテンツの特定のバージョンを照会したり、親コピー ブロックを見つけて最新バージョンを検索したりできます。(この場合、バージョン #3)

そこで私の質問です。すべてのコンテンツ ブロックの最新バージョンを常に返すクエリを思いつく人はいますか? 理想的には、クエリは次の結果を返します。

id    content         parent_id
3     Heya, World!!   1

それ自体に参加することと関係があるように感じます。少なくとも 2 つの異なるクエリまたはサーバー側のコードがなければ、それを行う方法が思い浮かびません。

4

2 に答える 2

2

これを試して:

select id, content, parent_id
  from copy_blocks
 where (id, parent_id) in (
     select max(id), parent_id from copy_blocks group by parent_id
 )

テーブルが大きすぎると、クエリが遅くなる可能性があります。その場合は、インデックスを追加して改善してみてください。

于 2012-05-12T22:03:17.000 に答える
1

もう 1 つのオプション:

SELECT 
      c.*
FROM 
        ( SELECT parent_id
               , MAX(id) AS id
          FROM copy_blocks
          GROUP BY parent_id
        ) AS dc
    JOIN
        copy_blocks AS c
      ON 
        (c.parent_id, c.id) = (dc.parent_id, dc.id)
于 2012-05-12T22:17:25.800 に答える