2012-04-03 11 views
2

ここにシナリオがあります。 私は2つのPCクライアント(クライアントCAとCB)と1つのMYSQLサーバー(S1)を持っています。 CAはS1上のデータを常に生成して格納し、CBはS1からデータを取得し、それを用いてグラフィックを生成する。ループ内のmysqlから最後のn行を取得します

CBは常にS1からレコードをポーリングする必要があります。そのため、私はwhileループ内にあります。以前のクエリと重複することなく、ループ内の最後のnレコードを取得するにはどうすればよいですか。 I.

N = 100、

CAは、100件のレコードを挿入し、CBは

CAが50件のレコードを挿入し、最後の100件のレコードを取得し、CBは、最後の100個のレコードを取得します。これらのレコードのうち50件は前のクエリと同じです。

助けてください。

答えて

1

レコードが挿入されたときを追跡するフィールドをテーブルに追加します。

次に、取得した最新のタイムステップがCBクライアントのトラックに記録され、最後にプルされた時間より新しいレコードのみにその選択が制限されます。

1

私はあなたがコラム「CREATE_TIME」でデータをいくつかのタイムスタンプを保存推測:

SELECT * FROM my_table WHERE create_time > time_modified_on_every_iteration ORDER BY create_time LIMIT 0, 100 

そして、あなたのループ:正確ではない構文については

Date lastDate = some_very_old_date; 
while(true) { 
    rows = sql_query.getData(time_modified_on_every_iteration = lastDate); 
    iter = rows.iterator() 
    while (iter.hasNext()) { 
    // do stuff with current row 
    if(!iter.hasNext()) { 
     // last cycle 
     lastDate = iter.current.getCreate_time(); 
    } 
    } 
} 

謝罪、それはアイデアについてです。

0

同じ秒に複数のレコードが作成される可能性がある場合は、タイムスタンプではなく自動インクリメントIDを使用することをお勧めします。次に、与えられたタイムスタンプの例では、最後に受信したレコードのIDより大きなIDを持つレコードを照会することができます。

SELECT * FROM tbl WHERE id > last_received_id ORDER BY id ASC LIMIT 100; 
関連する問題