1

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 クエリでサブセレクトを実行するのを避け、代わりに最初のエイリアスを参照する方法があるのだろうかと思っています。手動で一時テーブルを作成することなく、これを達成するためのより効率的な方法はありますか? ここで何が間違っていますか?

4

1 に答える 1

1

アップデート:

パフォーマンスの詳細については、私のブログのこの記事を参照してください。


インデックスが作成されている場合termは、次を実行できます。

SELECT  *
FROM    (
        SELECT  *
        FROM    terms
        WHERE   term <= @myterm
        ORDER BY
                term DESC
        LIMIT 10
        ) q
UNION ALL
SELECT  *
FROM    (
        SELECT  *
        FROM    terms
        WHERE   term > @myterm
        ORDER BY
                term
        LIMIT 20
        ) q
ORDER BY
        term

、より効率的になります。

于 2009-07-17T17:16:20.570 に答える