2016-08-02 55 views
1

这里说的是表格,列A,B,C,D,E。我想通过列E.为了限制后,从A列不同的值如何限制不同的值,并避免在查询中按顺序扫描整个表格

我知道,如果没有秩序的,下面的查询工作:

set @num := 0, @pa = ''; 
select A, B, C, D, @num := if(@pa = A, @num, @num+1) as row_number, @pa := A as dummy 
from table group by A having row_number <= 100; 

但是,如果“ORDER BY E”被添加到的结束查询,'order by'仅在选择100行后处理结果。

我知道它的工作原理是首先对表格进行排序,然后从列A中选择不同的100个值,但这样整个表格就被扫描了。由于整个表格非常大,我不希望对它进行全面扫描。

因此,我的问题是如何先排序它,然后选择列A上的前100个不同的值,而不扫描整个表。

-------- ----------更新

我试图

set @num := 0, @pa = ''; 
select A, B, C, D, @num := if(@pa = A, @num, @num+1) as row_number, @pa := A as dummy 
from table where row_number <= 100 order by E; 

但这不起作用。

+0

为什么它不工作?没有你的数据对不起?只是问问。任何返回值 –

+0

它有语法问题。查询无法以这种方式找到'row_number'。 – Cuero

+0

好的,你现在没有任何问题吗? –

回答

0

也许你可以试试这个:

select * from (select A, B, C, D, E from table order by E) as temp 
group by A having count(A) <= 100 
+0

不,'从E'按顺序选择A,B,C,D,E扫描整个表格。这个查询的结果是错误的。 – Cuero

+1

那么,列E的排序将使用此列的索引。默认排序(B-tree)。从这个排序列表中,你只需要A的前100个不同的值,对吧?可能是这个查询将有助于'通过E limit 100'从表格顺序中选择不同的A,B,C,D? –

+0

是的,它几乎可行。但是如果我想要B,C,D中的所有数据在列A中具有第一个不同的100个值,我现在可以得到的是'SELECT * from(通过E按顺序从表中选择A)tmp inner join table on table.A = tmp.A' – Cuero