我有一个基本的 MySQL 表terms,由id和term字段组成。
我想创建一个按字母顺序排序的字典索引(在字面意义上),它将在所选术语上方列出 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。是否有更有效的方法来完成此操作而无需手动创建临时表?我在这里做错了什么?