2011-02-07 33 views
5

Như tôi đang cố gắng để đếm số lượng các bản ghi trong một bảng, ngay cả khi các câu lệnh SQL có LIMIT vào nó, tổng thể nó hoạt động, tuy nhiên cái gì lạ xảy ra, mã:Đếm hồ sơ MySQL với một LIMIT

$sql = "SELECT COUNT(*) AS count FROM posts 
     ORDER BY post_date DESC 
     LIMIT 5"; 

// ... mysql_query, etc 

while($row = mysql_fetch_array($result)) 
{ 
    // ... HTML elements, etc 
    echo $row['post_title']; 

    // ... HTML elements, etc 

    echo $row['count']; // this displays the number of posts (which shows "12"). 
} 

Mặc dù, khi hiển thị thông qua các while vòng lặp, nó sẽ hiển thị này:

Notice: Undefined index: POST_TITLE trong /Applications/MAMP/htdocs/blog/index.php trên đường dây 55

Nếu tôi xóa COUNT(*) AS count, mọi thứ sẽ hiển thị hoàn hảo ... làm thế nào nó hoạt động?

+2

tại sao bạn giới hạn truy vấn chọn chỉ trả về 1 kết quả? – UnkwnTech

+0

Tôi chắc chắn '$ count = 5;' sẽ phù hợp với bạn hầu hết thời gian. –

+0

Tôi đoán bạn đã không đọc đúng ... – MacMac

Trả lời

15

Không sử dụng COUNT(*) để đếm số hàng (vì nhiều lý do). Viết ra truy vấn đầy đủ của bạn, và thêm SQL_CALC_FOUND_ROWS ngay sau khi SELECT:

SELECT SQL_CALC_FOUND_ROWS id, title FROM foo LIMIT 5; 

Sau đó, sau khi truy vấn thực hiện (ngay sau khi), chạy:

SELECT FOUND_ROWS(); 

Điều đó sẽ trả lại số hàng bản gốc SELECT sẽ quay trở lại nếu bạn không có LIMIT ở cuối (chiếm tất cả các phép nối và mệnh đề).

Nó không phải di động, nhưng nó rất hiệu quả (và IMHO đúng cách để xử lý loại vấn đề này).

+1

+1, học được điều gì đó mới :) – JohnB

+1

+1 là câu trả lời đúng. –

+0

(Lưu ý: không di động nghĩa là bạn không thể sử dụng điều này trên cơ sở dữ liệu khác. Xem câu trả lời của @ JohnB về cách thực hiện điều này trên cơ sở dữ liệu quan hệ thực tế) –

0

Bạn đang yêu cầu tuyên bố SELECT để chỉ trả lại COUNT(*) AS count. Nếu bạn muốn trả về nhiều cột hơn, bạn phải chỉ định chúng trong câu lệnh SELECT.

+0

Trong trường hợp OP làm như vậy sẽ đại diện cho cùng một bảng hàng đếm dưới dạng giá trị cột cho 5 hàng. Nếu không có GROUP BY thì kết quả sẽ không có ý nghĩa gì. Nó phải là hai truy vấn. Một để có được số lượng, một để có được dữ liệu. Đơn giản và dễ dàng. –

1

LIMIT không làm gì ở đây vì bạn đang chọn một vô hướng đơn. Lỗi được hiển thị vì bạn không chọn tiêu đề bài đăng, vì vậy nó không có trong mã băm $row.

0

Bằng cách bao gồm COUNT(*) AS count bạn đã xóa các cột thực tế mà bạn muốn nhận thông tin. Hãy thử sử dụng

SELECT *, COUNT(*) AS count FROM posts ORDER BY post_date DESC LIMIT 5 

truy vấn đó sẽ đạt được cả hai điều bạn đang cố gắng làm trong một truy vấn, nhưng thực sự, này nên được chia ra thành 2 truy vấn riêng biệt. Mục đích tổng thể để có COUNT trong truy vấn là gì? Nó nên được thực hiện theo một cách khác.

+1

Đây không phải là câu trả lời hay. Bạn sẽ lấy lại một hỗn hợp thông tin lộn xộn - cùng tổng số hàng trong bảng của bạn dưới dạng giá trị cho mỗi hàng. Bạn nên làm điều này trong hai truy vấn. –

+0

@Mike (và một người khác đã bỏ phiếu cho câu trả lời này): Mitch không đề xuất thực hiện 'SELECT *, COUNT (*)', anh ta chỉ cố gắng minh họa những gì OP đang cố gắng thực hiện trong một truy vấn, thay vì 2, tất nhiên sẽ có ý nghĩa hơn. Mitch nói rằng trong phần dưới cùng của câu trả lời của anh ta. +1 Mitch. – JohnB

+0

Tôi đoán nếu bạn muốn trở thành pedantic, câu trả lời cho câu hỏi OP, nhưng rõ ràng câu trả lời "tốt nhất" nên là câu trả lời câu hỏi và hướng dẫn OP làm điều "đúng" ... @Mitch không thực sự cho một cách "dễ dàng hơn", trong khi các bài viết khác đã làm (@ircmaxell, @nalroff). Tôi -1 điều này và +1 câu trả lời "tốt nhất" để khuyến khích OP suy nghĩ hai lần về việc làm đúng (hy vọng OP sẽ tìm hiểu thêm về các chức năng tổng hợp vào một ngày khác) –

1

Điều này đang xảy ra vì COUNT() là hàm tổng hợp. Bạn sẽ phải thực hiện hai truy vấn riêng biệt để có được cả số lượng hàng trong bảng và các bản ghi riêng biệt.

0

Bạn đang trộn một hàm tổng hợp COUNT() với lựa chọn chuẩn. Bạn không thể có được tiêu đề bài đăng chính xác mà không có mệnh đề GROUP BY trong truy vấn tổng hợp của mình. Điều đơn giản nhất bạn nên làm là thực hiện hai truy vấn này - một cho số truy vấn của bạn, số còn lại cho thông tin bài đăng của bạn. Ngoài ra, không có ý nghĩa khi sử dụng LIMIT trên một hàm tổng hợp mà không có cột nào khác trong (bỏ qua) GROUP BY - truy vấn hiện tại sẽ luôn trả về một hàng.

1

Điều mọi người đang cố gắng nói là bạn nên chọn sử dụng 2 truy vấn riêng biệt thay vì 1 truy vấn đơn lẻ.

1) được đếm hàng của bảng

$sql = "SELECT COUNT(*) AS count FROM posts; 

2) nhận được 5 dòng cuối cùng của bảng

$sql = "SELECT * FROM posts 
     ORDER BY post_date DESC 
     LIMIT 5"; 
0

tôi đã cùng một vấn đề và tìm thấy bài viết này: http://www.mysqldiary.com/limited-select-count/ cách tốt nhất (đặc biệt cho các bảng lớn) đang sử dụng nó như sau:

SELECT COUNT(*) AS count FROM (SELECT 1 FROM posts 
    ORDER BY post_date DESC 
    LIMIT 5) t 

bây giờ nó trả về một số từ 0 đến 5