idフィールドとtermフィールドで構成される基本的な MySQL テーブルtermsがあります。
アルファベット順に並べ替えられた辞書インデックス (文字通りの意味で) を作成したいと考えています。これは、選択した用語の上に 10 個の用語をリストし、その下に 20 個の用語をリストします。この例は、http://www.urbandictionary.com/define.php? term=GD2&defid=3561357にあります。左側の列では、現在の用語が強調表示され、その上にいくつかの用語が表示され、下にいくつかの用語が表示されます。 、すべてアルファベット順にソートされています。
ご存知のように、MySQL は ROW_NUMBER() や同様の関数をサポートしていないため、最終的にはユーザー変数とサブセレクトに頼ることになります。また、MySQL では許可されていないため、ユーザー定義変数を使用してビューを作成することもできません。これが私が思いついたものです(そしてそれは機能します):
SET @row_num := 0;
SELECT
@term_index := ordered.row_number
FROM
(
SELECT
@row_num := @row_num + 1 AS row_number, terms.*
FROM
terms
ORDER BY
term ASC
) AS ordered
WHERE
ordered.term = 'example term';
SET @row_num := 0;
SELECT *
FROM
(
SELECT
@row_num := @row_num + 1 AS row_number, terms.*
FROM
terms
ORDER BY
term ASC
) AS ordered
WHERE
row_number BETWEEN @term_index - 10 AND @term_index + 20
最初の SELECT は、アルファベット順に並べ替えられた用語テーブル全体でターゲット用語の行番号を見つけるだけです。2 番目の SELECT は、その情報を使用して、その上に 10 語、下に 20 語を取得します。
2 番目の SELECT クエリでサブセレクトを実行するのを避け、代わりに最初のエイリアスを参照する方法があるのだろうかと思っています。手動で一時テーブルを作成することなく、これを達成するためのより効率的な方法はありますか? ここで何が間違っていますか?