2016-05-18 8 views
-3

私は約10M行(ID、最初、最後など)のテーブル(名前)を持っており、私はそれを姓で消化可能なグループに分割する必要がありますレター(例:100でグループ化されたAで終わるすべての姓)、および各グループの最初と最後のレコードを取得します。MySQLクエリ - 大きなクエリのグループから最初と最後の行を取得

私は最も効率的な方法は何か、サブクエリーに精通していないか分かりません。私は姓の文字(すべてのA)で行を数え、100で割り、最初と最後の行を選択すべきだと思いますか?効率的なクエリを取得するためにここで苦労しています。

SELECT COUNT(id) 
FROM names 
WHERE last REGEXP '^[A].*$'/100 

は私のグループ

SELECT COUNT (id), min(first), max(last), 
     (SELECT COUNT(id) 
     FROM names 
     WHERE last REGEXP '^[A].*$'/100) 
FROM names 

のカウントを与えるOK基本から始めてみましょう右構文に

+1

なぜ正規表現を含む文字列を100で除算していますか? – Barmar

+0

カウントを100で割ったければ、それは 'COUNT(id)/ 100'でなければなりません。 – Barmar

+1

"100"の表記が何であるかは不明です。ぺージ化された結果を得たいと思っていますか?言い換えれば、100行だけを必要とする場合は、最初に文字で結果セットを分割するのはなぜですか? 10Mのレコードでは、1文字あたり100行以上の>>があると仮定します。また、ここでは 'REGEXP'のオーバーヘッドの必要はありません。このユースケースに 'LIKE'を使うだけです。 –

答えて

0

を取得することはできません。これらの各グループから非常に最初と最後の名前を取得する方法である必要がありますよりも、挑戦

SELECT last, first 
FROM names 
WHERE last LIKE '%a' 
ORDER BY last ASC 
LIMIT 0,100 /* query for first page */ 

:まず第一に、改ページを行うには、次のようなクエリが必要になります。残念ながら、上記の結果セットの最初と最後のレコードを手作業で検査してから100を増分して何度も同じことを繰り返す以外の方法はありません。アプリケーションを使用するのが最適です結果セット内のポインタを簡単にスキップすることができます。ポインターを簡単に移動できると仮定すると、ページングされていない単一のクエリーでこれを行い、ポイントを1番目、100番目、101番目、200番目などのレコードに移動して値を抽出することもできます。

これは、これを26回実行する必要があるため、ナビゲーション要素をレンダリングする必要があるたびに、アプリケーションが実行するのは非常に不合理なアクションです。これにより、ナビゲーションの経験を再考するか、ナビゲーション表示に使用するために結果を合理的にキャッシュするためのソリューションを考え出すことがあります。再びあなたが必要があるだろうけど

SET @x=0; 
SELECT `last`, `first` 
FROM (
    SELECT @x:[email protected]+1 AS `counter`, `last`, `first` 
    FROM names 
    WHERE last LIKE '%a' 
    ORDER BY `last` ASC 
) AS all_rows 
WHERE `counter` MOD 100 = 0 
OR `counter` MOD 100 = 1 

代替はグループ化し、行(すなわち係数)を取得するために数学的な平均値を使用して、各最初の文字のために1からxにすべての行に番号を代理カウンタフィールドを使用して含めることができますすべての第2レベルのナビゲーションオプションを生成したい場合は、これを26回実行します。

関連する問題