Tôi cần một tuyên bố MySql rằng sẽ chọn tất cả các hàng, cũng như bao nhiêu hàng tổng có.
Khi được thực hiện theo nghĩa đen, điều này là không thể. Kết quả của một truy vấn SQL là một bảng (ảo); cột trong mỗi hàng trong bảng kết quả đó cung cấp một giá trị chỉ được liên kết với hàng đó và các hàng có hiệu lực độc lập với nhau.
Có nhiều cách để lấy số lượng hàng trong toàn bộ kết quả, nhưng được thực hiện trong hai câu lệnh hoặc với truy vấn khác với khái niệm của bạn. (Giải pháp dưới đây)
Có một khía cạnh trong câu hỏi ban đầu của bạn có thể được hiểu theo nhiều cách:
cũng như có bao nhiêu tổng hàng có
Điều này có nghĩa một trong hai:
- Đếm từng hàng được trả lại trong kết quả.
- Đếm mỗi hàng mà có thể đã được trả lại nếu nó không được cho LIMIT khoản (mà truncates kết quả đến 5 hàng trong trường hợp này)
(Tôi sẽ đưa ra câu trả lời cho cả hai bên dưới)
nhưng chỉ trả về một hàng. Tôi đoán đó là vì COUNT (*) sẽ giống nhau cho mỗi hàng, và vì một lý do nào đó, MySql chỉ trả về các hàng với các giá trị duy nhất cho nó? Tôi không có đầu mối.
COUNT
là hàm tổng hợp. Bằng cách sử dụng hàm tổng hợp, bạn đang yêu cầu cơ sở dữ liệu gộp nhóm các hàng và chiếu một số khía cạnh của nó vào một hàng duy nhất. Điều gì là khó hiểu là mysql cũng bạn kết hợp các biểu thức không tổng hợp và tổng hợp trong cùng một danh sách SELECT
. Hầu hết các cơ sở dữ liệu khác không cho phép điều này và cung cấp cho bạn một lỗi cho điều này, nhưng alas MySQL không.
Nhưng COUNT (*) vẫn tổng hợp tất cả các hàng thành một hàng, đại diện cho toàn bộ nhóm hàng.
Ngoài ra, nếu có cách tốt hơn để có tổng số hơn để thêm cột phụ vào mỗi hàng, thì tôi muốn thay thế. Cảm ơn bạn!
có, có một số cách.
Nếu bạn muốn lấy số hàng được trả về PHP, vì vậy, sau khi MySQL áp dụng điều khoản giới hạn, tôi đề nghị chỉ cần gọi hàm php mysql_num_rows
(http://www.php.net/manual/en/function.mysql-num-rows.php) sau khi thực hiện cuộc gọi mysql_query
.
Nếu bạn muốn nhận được số hàng có thể được trả lại khi không có mệnh đề LIMIT
, tôi khuyên bạn nên thực hiện theo 2 bước: trước tiên, thực hiện phiên bản được sửa đổi chậm của truy vấn ban đầu, sau đó, đó, gọi hàm FOUND_ROWS
của MySQL. (Xem http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows)
Nó sẽ trông như thế này:
$result = mysql_query('SELECT SQL_CALC_FOUND_ROWS * FROM posts LIMIT 0, 5');
//do stuff with the result, but don't do any other queries
//get the total number of rows (disregarding the LIMIT clause)
$result = mysql_query('SELECT FOUND_ROWS()');
Các modifier SQL_CALC_FOUND_ROWS
nói với MySQL để theo dõi tổng số hàng trước khi áp dụng mệnh đề LIMIT
và FOUND_ROWS()
lợi nhuận con số đó. Giữ 2 điều trong tâm trí:
- cả những
mysql_query
cuộc gọi phải được thực hiện qua kết nối cùng
- Đừng thực hiện một truy vấn Inbetween những cuộc gọi đến
mysql_query
Oh, lưu ý cuối cùng: khi sử dụng LIMIT
, bạn thường muốn kết quả được sắp xếp theo một cách cụ thể. Thông thường, mọi người sử dụng LIMIT
để phân trang. Nếu bạn không đặt hàng, thứ tự không xác định và các truy vấn tiếp theo có thể trả lại các hàng đã được trả về bởi các câu lệnh trước, ngay cả khi bù đắp LIMIT
là khác nhau. Bạn có thể đặt hàng một cách rõ ràng kết quả bằng cách sử dụng mệnh đề ORDER BY
. (http://dev.mysql.com/doc/refman/5.5/en/select.html)
Nếu bạn đang sử dụng PHP, tại sao không sử dụng 'mysql_num_rows' – hjpotter92
@ hjpotter92 nhưng nó phụ thuộc vào" tổng "OP đang suy nghĩ. Tổng số hiện được chọn (hơn 'mysql_num_rows' là tốt) hoặc số hàng trong toàn bộ bảng. –
Điểm tốt, @Michal. Tôi đã giải quyết cả hai trường hợp trong câu trả lời của tôi. –