MySQL查询 - 获取第一个&来自较大查询组的最后一行

时间:2016-05-18 20:31:02

标签: mysql

我有一个表(名称),大约有10M行(id,first,last等),我需要通过姓氏字母将其分解成易消化的组(例如,以A组结尾的所有姓氏以A结尾),并抓住每组的第一个和最后一个记录。

我不确定最有效的方法是什么,不熟悉子查询。我想我应该按姓氏字母计算行数(所有A' s),除以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  

无法获得正确的语法

1 个答案:

答案 0 :(得分:0)

好的,让我们从基础开始吧。首先,要进行分页,您需要查询:

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

您遇到的挑战是如何从每个组中获取名字和姓氏。不幸的是,除了手动检查上面结果集的第一个和最后一个记录,然后为每个增量为100的反复重复相同的事情之外,没有其他真正简单的方法。您最好使用一个应用程序-s DB库,允许您轻松跳过结果集中的指针。假设您能够轻松移动指针,您也可以使用单个非分页查询执行此操作,并将您的点移动到第1个,第100个,第101个,第200个等记录以提取值。

对于每次想要渲染导航元素时应用程序来说,这可能是一个非常不合理的操作,因为您需要这样做26次。这可能会导致您完全重新考虑导航体验,或者提出合理缓存结果的解决方案,以便在导航显示中使用。

备选方案可以包括使用代理计数器字段为每个第一个字母分组编号从1到x的所有行,并使用数学平均值来获取行(即模数):

SET @x=0;
SELECT `last`, `first`
FROM (
    SELECT @x:=@x+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

如果你想生成所有的二级导航选项,你需要做26次。