1

我有一个基本的 MySQL 表terms,由idterm字段组成。

我想创建一个按字母顺序排序的字典索引(在字面意义上),它将在所选术语上方列出 10 个 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 只是在整个按字母顺序排序的术语表中找出目标术语的行号。第二个 SELECT 使用该信息在其上方获取 10 个术语,在其下方获取 20 个术语。

我想知道是否有办法避免在第二个 SELECT 查询中运行子选择,而只引用第一个别名为ordered。是否有更有效的方法来完成此操作而无需手动创建临时表?我在这里做错了什么?

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 回答