2014-06-11 98 views
1

下面是一個包含20個項目的測試表。選擇具有特定行號值的行

create table test (id int not null primary key); 
insert into test values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19); 

我可以這樣添加行號列(提琴:http://sqlfiddle.com/#!2/dade4/3):

select id, @r:[email protected]+1 r 
from test a 
join (select @r:=0) b; 

然後我試圖讓第一10個項目有HAVING條款(小提琴:http://sqlfiddle.com/#!2/dade4/4):

select id, @r:[email protected]+1 r 
from test a 
join (select @r:=0) b 
having r <= 10; 

這裏有意想不到的結果:

ID| R 
------ 
0 | 2 
1 | 4 
2 | 6 
3 | 8 
4 | 10 

這是爲什麼,以及如何檢索r在1和10之間的行?

(我沒有使用限制,因爲在不同的查詢,我需要選擇每個類別的前n項)

回答

1

我與其他的答案一致,having是沒有辦法的辦法,但如果你需要使用它,那麼:

select id, @r:[email protected]+1 r 
    from test a 
    join (select @r:=0) b 
having @r+1 <= 10; 

這裏demo in SQLFiddle

你之所以得到錯誤結果的原因是因爲MySql計算兩次別名r(在select和in中),所以@r:[email protected]+1被執行兩次。

1

HAVING,除非你在聚合(SUM()是沒有意義的,COUNT()GROUP BY)查詢。

您需要將您的rownumbering封裝在適當的子查詢中(http://sqlfiddle.com/#!2/dade4/6/0)。

select id, r 
    from (select id, @r:[email protected]+1 r 
     from test a 
     join (select @r:=0) b 
    ) as q 
where r <= 10; 
1

我遇到了類似的問題,當我回答這個問題:

Mysql: Gap detection query not detecting gaps

的MySQL顯然執行HAVING測試,因爲它是產生結果時,沒有聚集正在做,這將導致一些短路。

解決方案是使用子查詢。

select id, r 
    from (select id, @r:[email protected]+1 r 
     from test a 
     join (select @r:=0) b 
    ) as q 
where r <= 10;