2009-07-14 31 views
13

Tôi đang cố tạo một thư viện hình ảnh đơn giản, hiển thị 16 hình ảnh trên mỗi trang. Tôi đang sử dụng LIMIT 16 để hiển thị số tiền chính xác trên trang, nhưng nếu có hơn 16 hàng, tôi muốn có các liên kết ở dưới cùng, cho phép người dùng điều hướng đến trang tiếp theo.Tổng số hàng SQL khi sử dụng LIMIT

Tôi biết tôi có thể đạt được kết quả mong muốn bằng cách xóa giới hạn và chỉ sử dụng vòng lặp để hiển thị 16 mục đầu tiên, nhưng điều này sẽ không hiệu quả. Hiển nhiên, COUNTING số hàng sẽ luôn luôn = 16.

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at LIMIT 16"; 

Có ai đề xuất cách làm hiệu quả hơn không?

Cảm ơn

Trả lời

1

Bạn cần phải bù đắp kết quả của bạn cho trang web nào bạn đang ở trên ngoài các truy vấn riêng biệt để nhận được số lượng mà tất cả mọi người khác đã đề cập.

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at 
    LIMIT ". ($page - 1) * $pagesize .", ". $pagesize; 

Cảnh báo bình thường về việc chèn SQL sẽ được áp dụng tại đây.

+0

+1 cho thông báo về tiêm SQL. – andyk

3

bạn đang cố gắng để đánh số trang đầy đủ, hoặc chỉ có this pagenext page? Nếu đó là sau này bạn chỉ có thể LIMIT 17 và đếm các hàng của kết quả. Nếu bạn nhận được 17 bạn cần phải phân trang.

3

Chạy truy vấn riêng biệt không có giới hạn chỉ trả về số lượng.

+0

trong câu trả lời được đánh giá cao nhất, bạn có thể giải thích thêm tại sao bạn lại nói điều này? –

+1

@timpeterson Nó cũng là một lựa chọn hợp lệ. Nó có một số vấn đề với việc phải nhấn cơ sở dữ liệu hai lần, nhưng nó vẫn là một câu trả lời hoàn toàn hợp lệ (nếu ít hiệu quả hơn). Và theo như hiệu quả của nó đi, tùy thuộc vào những gì bạn đang làm, đôi khi câu trả lời được đánh giá hàng đầu có thể vi phạm DRY bằng cách cho bạn hai cách khác nhau để có được thông tin tương tự. – RonLugge

0

sử dụng hai truy vấn, nơi người ta là truy vấn của bạn và người kia là:

SELECT COUNT(primary_key) FROM ... WHERE... 
28

Trong MySQL:

SELECT SQL_CALC_FOUND_ROWS 
     * 
FROM posts p, images im, postimages pi 
WHERE i.active = 1 
     AND pi.post_id = p.id 
     AND pi.image_id = im.image_id 
ORDER BY 
     created_at 
LIMIT 16; 

SELECT FOUND_ROWS(); 

Truy vấn đầu tiên sẽ trở lại 16 hàng, và truy vấn thứ hai sẽ đưa bạn trở về số hàng đó sẽ được trả lại có mặt ở đó không LIMIT điều khoản trong truy vấn đầu tiên.

Bạn có thể sử dụng nó để quyết định có hiển thị liên kết "tiếp theo" hay không.

+0

Có cách nào tương tự để thực hiện việc này trong Oracle không? – ria

+0

+1. Xem thêm tài liệu MySQL: [http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_found-rows] – Wolfgang

+0

- @ Quassnoi, làm thế nào để bạn trả về kết quả cho cả 1 và 2 truy vấn? Tôi chỉ có thể thấy kết quả 'FOUND_ROWS()'. –

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