2017-01-23 17 views
0

データベースからレコードを取得するアプリケーションを作成しています。クライアントが領域ごとにデータを並べ替えることができるかどうかを尋ねました。私は、次のクエリを持っている:MySQL - 整数で順序付けされたレコードをさらに取得する

SELECT 
    * 
FROM 
    customers 
WHERE 
    account_type != 'x' 
AND 
    account_type != 'tor' 
ORDER BY 
    area ASC, 
    id ASC 
LIMIT 30 

クエリはすべて1の面積値で、データの価値が30行を返します。

別の30行をフェッチするように設定されたAJAXクエリがありますが、領域ごとにデータを並べ替えるため、次の例に示すように単純な範囲文字列をクエリに合わせることはできません:

データベースから次の30レコードを収集するクエリを作成するにはどうすればよいですか?

また、領域値が0のレコードがあります。これはリストの最初のレコードとして表示されません。どうしてこれなの?そして私はこれをどのように修正できますか?

おかげ

+0

サンプルデータと期待される出力をお願いします。 – Wanderer

+1

「AND id> 30」を追加することがページネーションを行う正しい方法だと思えば、まずは間違っています。 LIMITとOFFSETで作業します。 – CBroe

+1

_ "また、エリア値が0のレコードがあります。これはリストの最初のレコードとして表示されません。" _ - それは '0'ですか、それとも' NULL'ですか?それらは2つの完全に異なるものです。 – CBroe

答えて

1

まず、単一not inwhere条件を結合:

SELECT c.* 
FROM customers c 
WHERE account_type NOT IN ('x', 'tor') 
ORDER BY area ASC, id ASC 
LIMIT 30; 

続いて、次のセット、使用のために:

SELECT . . . 
OFFSET 30 
LIMIT 30 

これはidは内で一意であることを前提としていテーブル。それはソートを安定させるので重要です。要約すると

https://dev.mysql.com/doc/refman/5.7/en/select.html

[LIMIT {[offset,] row_count | row_count OFFSET offset}] 

、レコードをxはちょうどlimitリターン:

1

は、SELECTクエリのドキュメントを見てください。オフセットを使用すると、開始位置を設定することができ、基本的にページングを許可します。

1

あなたは

SELECT 
    * 
FROM 
    customers 
WHERE 
    account_type != 'x' 
AND 
    account_type != 'tor' 
ORDER BY 
    area ASC, 
    id ASC 
LIMIT 30, 30 

行から30

を開始するあなたの次の30行を与える必要がありますしたい30件の結果を選ぶときに起動するように指示パラメータに送ることができるようにMySQLのLIMITは、オフセットオプションのパラメータを取ります
関連する問題