2012-02-05 42 views
6

Tôi có một truy vấn sẽ trả về một hàng. Có cách nào tôi có thể tìm thấy chỉ số hàng của hàng tôi đang truy vấn khi bảng được sắp xếp không?Nhận số hàng cho truy vấn

Tôi đã thử rowid nhưng nhận đượC# 582 khi tôi đang mong đợi hàng # 7.

Ví dụ:

CategoryID Name    
    I9GDS720K4 CatA 
    LPQTOR25XR CatB 
    EOQ215FT5_ CatC 
    K2OCS31WTM CatD 
    JV5FIYY4XC CatE 
--> C_L7761O2U CatF <-- I want this row (#5) 
    OU3XC6T19K CatG 
    L9YKCYAYMG CatH 
    XKWMQ7HREG CatI 

Tôi đã thử rowid với kết quả bất ngờ:

SELECT rowid FROM Categories WHERE CategoryID = 'C_L7761O2U ORDER BY Name 

EDIT: Tôi cũng đã cố gắng đề nghị J Cooper (dưới đây), nhưng những con số hàng chỉ không đúng.

using (var cmd = conn.CreateCommand()) { 
     cmd.CommandText = string.Format(@"SELECT (SELECT COUNT(*) FROM Recipes AS t2    WHERE t2.RecipeID <= t1.RecipeID) AS row_Num 
       FROM Recipes AS t1 
       WHERE RecipeID = 'FB3XSAXRWD' 
       ORDER BY Name"; 
     cmd.Parameters.AddWithValue("@recipeId", id); 
     idx = Convert.ToInt32(cmd.ExecuteScalar()); 
+1

Tại sao bạn sửa đổi truy vấn của tôi cho '... WHERE t2.RecipeID <= t1.RecipeID'? Trong câu hỏi của bạn, bạn đang yêu cầu số hàng liên quan đến 'Name' không phải' RecipeID' - đó là lý do tại sao bạn không nhận được kết quả tốt, sử dụng 'WHERE t2.Name <= t1.Name' thay vì –

Trả lời

16

Đây là một cách để có được số lượng hàng trong Sqlite:

SELECT CategoryID, 
     Name, 
     (SELECT COUNT(*) 
     FROM mytable AS t2 
     WHERE t2.Name <= t1.Name) AS row_Num 
FROM mytable AS t1 
ORDER BY Name, CategoryID; 
+0

Tôi cảm thấy như tôi ' m làm điều gì sai hoặc thiếu một hành vi quirk. Các số hàng đều khác nhau, tùy thuộc vào ID nào tôi sử dụng, nhưng không có số nào trong số đó là những gì tôi mong đợi. Có thể nó có liên quan đến việc sử dụng chuỗi (TEXT) làm cột ID không? – Echilon

+0

Tại sao bạn sửa đổi truy vấn của mình thành '... WHERE t2.RecipeID <= t1.RecipeID'? Trong câu hỏi của bạn, bạn đang hỏi số hàng liên quan đến 'Name' không phải' RecipeID' - đó là lý do tại sao bạn không nhận được kết quả tốt, sử dụng 'WHERE t2.Name <= t1.Name' thay vì –

+0

. . Điều quan trọng là sắp xếp theo cột trong mệnh đề WHERE. – Echilon

-3

gì bạn đang yêu cầu có thể được giải thích theo hai cách khác nhau, nhưng tôi giả sử bạn muốn sắp xếp kết quả bảng và sau đó đánh số các hàng đó theo sắp xếp.

declare @resultrow int 

select 
     @resultrow = row_number() OVER (ORDER BY Name Asc) as 'Row Number' 
from Categories WHERE CategoryID = 'C_L776102U' 

select @resultrow 
+1

row_number() không có sẵn trong sqlite –

0

Đây là mẹo vui mà bạn có thể sử dụng trong Spatialite để nhận thứ tự các giá trị. Nếu bạn sử dụng hàm count() với mệnh đề WHERE chỉ giới hạn ở các giá trị> = giá trị hiện tại, thì số đếm thực sự sẽ đưa ra thứ tự. Vì vậy, nếu tôi có một lớp điểm được gọi là "điểm số" với cột "giá trị" và "val_order" thì:

SELECT value, (
SELECT count(*) FROM mypoints AS my 
WHERE my.value>=mypoints.value) AS val_order 
FROM mypoints 
ORDER BY value DESC; 

Cho thứ tự giảm dần của các giá trị. tôi có thể cập nhật "val_order" cột theo cách này:

UPDATE mypoints SET val_order = (
SELECT count(*) FROM mypoints AS my 
WHERE my.value>=mypoints.value 
); 
Các vấn đề liên quan