2012-05-03 34 views
9

Tôi đoán điều này đã được yêu cầu trong trang web trước đó nhưng tôi không thể tìm thấy nó.Số âm đạo trong câu lệnh chọn sql

Tôi đã thấy ở một số trang web có số lượng mơ hồ về kết quả tìm kiếm. Ví dụ, ở đây trong stackoverflow, khi bạn tìm kiếm một câu hỏi, nó nói +5000 kết quả (đôi khi), trong gmail, khi bạn tìm kiếm theo từ khóa, nó nói "hàng trăm" và trong google nó nói aprox X kết quả. Đây có phải chỉ là cách để cho người dùng thấy một số dễ hiểu không? hoặc đây thực sự là một cách nhanh chóng để đếm kết quả có thể được sử dụng trong cơ sở dữ liệu [Tôi đang học Oracle tại thời điểm 10g phiên bản]? một cái gì đó như "hey, nếu bạn nhận được hơn 1k kết quả, chỉ cần dừng lại và cho tôi biết có nhiều hơn 1k".

Cảm ơn

PS. Tôi mới vào cơ sở dữ liệu.

+2

câu hỏi hay. Tôi đang tìm kiếm câu trả lời quá – Dariop

Trả lời

1

Tôi không biết nhanh như thế nào điều này sẽ chạy, nhưng bạn có thể thử:

SELECT NULL FROM your_tables WHERE your_condition AND ROWNUM <= 1001 

Nếu đếm các dòng trong kết quả sẽ tương đương với năm 1001 thì tổng số hồ sơ sẽ> 1000.

1

Số âm đạo là một bộ đệm sẽ được hiển thị kịp thời. Nếu người dùng muốn xem thêm kết quả thì anh ấy có thể yêu cầu thêm.

Đây là cơ sở hiệu suất, sau khi hiển thị kết quả, các trang web như google tiếp tục tìm kiếm thêm kết quả.

3

Thông thường đây chỉ là một cách hay để hiển thị số.

Tôi không tin rằng có một cách để làm những gì bạn đang yêu cầu trong SQL - đếm không có một tùy chọn để đếm lên cho đến khi một số.

Tôi cũng sẽ không giả định điều này đến từ SQL trong cả gmail hoặc stackoverflow. Hầu hết các công cụ tìm kiếm sẽ trả về tổng số kết quả phù hợp cho tìm kiếm và sau đó cho phép bạn trang qua kết quả.

Như để làm một con số chính xác con người dễ đọc hơn, đây là một ví dụ từ Rails:

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_human

+0

Stack Overflow đang chạy trên SQL Server (theo như tôi biết) và [làm cho rất nhiều việc sử dụng SQL] (http://data.stackexchange.com/stackoverflow/queries). Vì vậy, tôi không chắc chắn lý do tại sao bạn muốn tuyên bố rằng điều này không nên được thực hiện với SQL? –

+1

Tôi nói không cho rằng nó đang sử dụng SQL, không phải là bạn không nên sử dụng SQL. Và trên thực tế, SO sử dụng lucene.net: http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/ –

+0

Rất tốt, cảm ơn gợi ý –

0

Khi bạn làm một truy vấn SQL bạn có thể đặt một

LIMIT 0, 100 

ví dụ và bạn sẽ chỉ nhận được hàng trăm câu trả lời đầu tiên. để bạn có thể in cho người xem của mình rằng có hơn 100 câu trả lời cho yêu cầu của họ.

Đối với google tôi không thể nói nếu họ thực sự biết có hơn 27'000'000'000 câu trả lời cho một yêu cầu nhưng tôi tin rằng họ thực sự biết. Có một số yêu cầu tiêu chuẩn có kết quả được lưu trữ và nơi cập nhật được thực hiện trong nền.

+1

'LIMIT 0, 100 'là cú pháp MySQL ... –

2

Với Oracle, bạn luôn có thể sử dụng các chức năng phân tích để tính chính xác số hàng sắp được trả lại. Đây là ví dụ về truy vấn như vậy:

SELECT inner.*, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS 
FROM (
    [... your own, sorted search query ...] 
) inner 

Điều này sẽ cung cấp cho bạn tổng số hàng cho truy vấn phụ cụ thể của bạn.Khi bạn muốn áp dụng phân trang là tốt, bạn có thể tiếp tục quấn các bộ phận SQL như vậy:

SELECT outer.* FROM (
    SELECT * FROM (
    SELECT inner.*,ROWNUM as RNUM, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS 
    FROM (
     [... your own, sorted search query ...] 
    ) inner 
) 
    WHERE ROWNUM < :max_row 
) outer 
WHERE outer.RNUM > :min_row 

Thay min_rowmax_row bởi các giá trị có ý nghĩa. Nhưng hãy cẩn thận khi tính số chính xác có thể tốn kém khi bạn không lọc bằng cách sử dụng UNIQUE SCAN hoặc hoạt động tương đối hẹp trên các chỉ mục. Đọc thêm về vấn đề này ở đây: Speed of paged queries in Oracle

Như những người khác đã nói, bạn có thể luôn luôn có một giới hạn trên tuyệt đối, chẳng hạn như 5000 để truy vấn của bạn sử dụng một bộ lọc ROWNUM <= 5000 và sau đó chỉ cần chỉ ra rằng có hơn 5000+ kết quả. Lưu ý rằng Oracle có thể rất giỏi tối ưu hóa các truy vấn khi bạn áp dụng lọc ROWNUM. Tìm một số thông tin về chủ đề đó ở đây:

http://www.dba-oracle.com/t_sql_tuning_rownum_equals_one.htm

Các vấn đề liên quan