2009-03-02 3 views
27

Tôi muốn lấy số hàng đã chọn cũng như dữ liệu đã chọn. Hiện nay tôi phải sử dụng hai câu lệnh sql:Cách lấy số hàng của kết quả được chọn từ sqlite3?

một là

select * from XXX where XXX; 

khác được

select count(*) from XXX where XXX; 

Nó có thể được thực hiện với một chuỗi sql đơn?

Tôi đã kiểm tra mã nguồn của sqlite3 và tôi đã tìm thấy chức năng của sqlite3_changes(). Nhưng chức năng này chỉ hữu ích khi cơ sở dữ liệu được thay đổi (sau insert, delete or update).

Có ai có thể giúp tôi giải quyết vấn đề này không? Cảm ơn nhiều!

+0

Mặc dù câu trả lời là có, hầu hết các câu trả lời dưới đây thêm phức tạp, bạn nên tránh. Không có gì sai khi chạy hai truy vấn.Nếu bạn đang xử lý dữ liệu sau truy vấn, bạn cũng có thể sử dụng các phương thức 'count()' hoặc 'size()' của đối tượng thu kết quả của bạn, tùy thuộc vào ngôn ngữ bạn đang sử dụng. – alttag

Trả lời

0

Khi bạn đã có kết quả select * from XXX, bạn chỉ có thể tìm thấy chiều dài mảng trong chương trình của mình đúng không?

+1

Tôi có thể. Nhưng chỉ cho đến khi tôi đi qua tất cả các hàng kết quả. Tôi muốn đếm số càng nhanh càng tốt – user26404

+2

Trong trường hợp đó, tôi đoán chạy hai truy vấn SQL thực sự là giải pháp đơn giản nhất. –

2

Bạn có thể kết hợp chúng thành một tuyên bố duy nhất:

select count(*), * from XXX where XXX 

hoặc

select count(*) as MYCOUNT, * from XXX where XXX 
+3

điều này chỉ trả về số hàng và chỉ hàng cuối cùng. – idursun

+1

có, tôi không thể nhận được các hàng kết quả chính xác bằng phương pháp này. – user26404

0

Nếu bạn sử dụng sqlite3_get_table thay vì chuẩn bị/bước/hoàn thiện bạn sẽ nhận được tất cả các kết quả cùng một lúc trong một mảng ("bảng kết quả"), bao gồm số và tên cột, và số hàng. Sau đó, bạn nên giải phóng kết quả với sqlite3_free_table

+0

Cảm ơn bạn. Tôi sẽ có một thử. – user26404

+3

Vì vậy, nếu bạn có 9 tỷ hàng, bạn dự kiến ​​sẽ lấp đầy bộ nhớ và ổ đĩa cứng của bạn để biết bạn có bao nhiêu hàng? Điều này thậm chí còn tồi tệ hơn làm một vòng lặp for với count + = sqlite3_step() == SQLITE3_ROW; – xryl669

13

SQL không thể kết hợp các kết quả một hàng (đếm) và nhiều hàng (chọn dữ liệu từ bảng của bạn). Đây là vấn đề thường gặp khi trả lại lượng dữ liệu khổng lồ. Dưới đây là một số mẹo về cách xử lý điều này:

  • Đọc N hàng đầu tiên và cho người dùng biết "nhiều hơn N hàng khả dụng". Không chính xác lắm nhưng thường đủ tốt. Nếu bạn giữ con trỏ mở, bạn có thể tìm nạp thêm dữ liệu khi người dùng chạm vào cuối chế độ xem (Google Reader thực hiện việc này)

  • Thay vì chọn trực tiếp dữ liệu, trước tiên hãy sao chép dữ liệu vào bảng tạm thời. Câu lệnh INSERT sẽ trả về số hàng được sao chép. Sau đó, bạn có thể sử dụng dữ liệu trong bảng tạm thời để hiển thị dữ liệu. Bạn có thể thêm "số hàng" vào bảng tạm thời này để giúp phân trang đơn giản hơn.

  • Tìm nạp dữ liệu trong chuỗi nền. Điều này cho phép người dùng sử dụng ứng dụng của bạn trong khi lưới dữ liệu hoặc bảng đầy với nhiều dữ liệu hơn.

15

thử cách này

select (select count() from XXX) as count, * 
from XXX; 
+0

Dòng đầu tiên tự làm việc cho tôi "chọn (chọn số() từ XXX) là số đếm;" ... Cảm ơn. – samosaris

+3

Dòng đầu tiên quá phức tạp nếu bạn mong muốn nhận được số lượng hàng. Chỉ cần thực hiện "SELECT COUNT (*) AS count FROM xxx;". – xryl669

2
select (select COUNT(0) 
      from xxx t1 
      where t1.b <= t2.b 
      ) as 'Row Number', b from xxx t2 ORDER BY b; 

chỉ thử this.

+0

Điều này thực sự thêm một chỉ mục vào các hàng đầu ra của bạn, nhưng không đếm các hàng (cho đến khi bạn đã đạt đến hàng cuối cùng) mà không tốt hơn "SELECT * FROM xxx;" và đếm số sqlite3_row() trả về SQLITE3_ROW, và nó cũng sắp xếp đầu ra của bạn mà có thể là bất ngờ. – xryl669

0

Bạn nên cố gắng này:

select (select count() from XXX) as count, * from XXX;