2012-05-12 19 views
0

の最新バージョンの照会:コピーの部分が最初に挿入されるとは、私は下記のように設定し、データベーステーブルを持っている行

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

、PARENT_ID自体に設定されています。例:

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

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

構造化物事この方法は、私は、コンテンツの特定のバージョンを照会、または親コピーのブロックを検索し、最新バージョンをルックアップするためにいずれかのことができます。 (この場合、バージョン#3)

これは私の質問です。誰もが常に最新のバージョンのコンテンツブロックを返すクエリを考え出すことができますか?理想的には、クエリは以下の結果を返します:

id content   parent_id 
3  Heya, World!! 1 

私はそれが自分自身に加わることと関係があると感じています。私は少なくとも2つの異なるクエリやサーバー側のコードなしでそれを行う方法について考えることができません。

+1

あなたはどのようなRDBMSを使用していますか?あなたは何を試しましたか? – Taryn

+0

私はMySQLを使用していますが、今はサーバーサイドで行っていますが、これは魅力的ではありません。 – Anthony

答えて

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) 
+0

私が読んだところでは、JOINはIN()より効率的ですから、私はあなたの答えがよかったと思います。小さなテストでは、クエリは0.0359秒で実行され、Pabloは0.0365で実行されました。それはかなり小さな違いですが、テーブルには3つのテスト行しかありません。全体的に、私はあなたの答えを勝者に投票する!しかし、Pabloのおかげで、あなたのバージョンもありました。 – Anthony

+0

@Anthony:あなたのテーブルはInnoDBまたはMyISAMストレージエンジンを使用していますか? –

+0

現在、私はMyISAMに物事を設定しています。私が読んだところでは、MyISAMは素早く読むことができ、InnoDBはすぐに書くのが良いです。 – Anthony

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 
) 

、クエリが遅いかもしれません。そのような場合には、改善のためにいくつかの指標を追加してみてください。

+1

これはうまくいきます! parent_idとidにインデックスを追加しました。うまくいけば、物事を妥当なものに保ちます。ありがとうパブロ! – Anthony

関連する問題