2017-08-27 4 views
2

CRMで顧客データを検索してソートし、ID番号12のID 9のデータのように1つのデータを開き、保存して次のエントリを取得します私は今ここで例6を使って最初のエントリを取得しますか?次のMYSQLエントリを取得する

過去に私はすべてを取り出してエントリを検索して次のものを得るためにループを行いましたが、Theresがより良いオプションになるはずです。

おかげ

SELECT * FROM testdata WHERE age > 18 ORDER BY age DESC 
Example of DB 
    |id|Name  |age| 
    |9 |perso1 |66 | 
    |10|rergfdgd |55 | 
    |11|gthfghfh |44 | 
    |9 |hghghgh |33 | 
    |1 |kgthht |22 | 
    |2 |ghjgj  |21 | 
    |3 |fhgjg  |20 | 
    |4 |hjhjhjh |19 | 
    |12|ghgjgjg |18 | 
    |6 |tgjhgf |17 | 
    |7 |jhmgmhg |16 | 
    |8 |fghgjgjg |15 | 

答えて

1

クエリが順番にフェッチする場合、カーソルは右の解決策になる:あなたが見つかった最後の行の位置が9だったことがわかっている場合は、https://dev.mysql.com/doc/refman/5.7/en/cursors.html

+0

カーソルはストアドルーチンでのみ機能することに注意してください。 –

1

orderと右のデータをフェッチすることができ、選択中limitの組み合わせ...

SELECT * 
    FROM testdata 
    WHERE age > 18 
    ORDER BY age DESC 
    LIMIT 9,1 

(注)この事実そのつまり、最初の9行を無視して1行だけを取得します。

は、私は完全な結果セットを引き出し、それらを介して、それぞれの時間をループすると、正常に動作します、同意するが、これを処理するよりエレガントな方法があるの詳細

+0

面白いようですが問題はthahtですデータはそれほど多くないかもしれません。その人はそれに取り組むことができますが、これは興味深いデータを減らすために私がループしなければならない場合です。 2人の男が同じcampainで働いているかもしれない – StefanBD

+0

おそらく、私は次のエントリと直前のエントリを直接私の反応状態に置いておくと、データを開くときにその次のものに移動するようにしてください。 – StefanBD

+0

誰かがすでに次のエントリに取り掛かっているなら、あなたが待ち行列を必要としているように聞こえて、次のエントリを取り出すだけです。新しいエントリがキューの最後に追加されます。 –

1

ためhttps://mariadb.com/kb/en/the-mariadb-library/select/#limitを参照してください。

ここに私の推薦があります。

オプション1: レコードがすでに編集されているかどうかを示すブール値フィールドを使用します。この例では、フィールドeditedのデフォルト値は0(偽)です。レコードが編集されたら、editedフラグを1(真)に変更します。

あなたの選択クエリは次のようになります。

SELECT * FROM testdata WHERE age > 18 and edited = 0 ORDER BY age DESC limit 1 

(あなたがLIMIT 1が含まれている場合にのみ記録)次に、あなたのPHPコードでは、結果をループする必要はありません、最初のレコードがありませんあなたのクエリの中にまだ編集されていない次のレコードがあります。

オプション2:date_modifiedフィールドにデフォルトのNULLを追加します。レコードが編集されると、now()date_modifiedフィールドに保存します。あなたのクエリは次のようになります。最初のオプションのように

SELECT * FROM testdata WHERE age > 18 and date_modified IS NOT NULL ORDER BY age DESC limit 1 

、結果をループする必要はありません、最初のレコードクエリの次のだろう(そして唯一のレコードは、あなたがLIMIT 1を含める場合、)はありませんまだ編集されていないレコード。

+0

いいアイデアだけど、もっと多くのユーザーがいるので動かないよ – StefanBD

+0

あなたは複数のユーザーが一度にシステムにアクセスしていることを意味しますか?その場合、このメソッドは引き続き動作します。代わりに、各ユーザーがレコードを取得すると、画面に表示される前にそのレコードを「取得済み」としてフラグを立てます。これにより、次のユーザーが同じレコードを取得できなくなります。また、私は ''のクエリをラップして、2人のユーザが同じレコードを同時に取得しないようにします –

関連する問題