2008-12-13 47 views
54

Tôi có một truy vấn để ảnh hưởng củaLấy số hàng với GROUP BY truy vấn

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

Tôi muốn biết nhiều tổng hàng truy vấn này sẽ quay trở lại mà không có sự LIMIT (vì vậy tôi có thể hiển thị thông tin pagination).

Thông thường, tôi sẽ sử dụng truy vấn này:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 

Tuy nhiên GROUP BY thay đổi ý nghĩa của COUNT, và thay vào đó tôi nhận được một tập hợp các hàng đại diện cho số các giá trị t3.id độc đáo trong mỗi nhóm .

Có cách nào để tính tổng số hàng khi tôi sử dụng GROUP BY không? Tôi muốn tránh phải thực hiện toàn bộ truy vấn và chỉ đếm số hàng, vì tôi chỉ cần một tập con của các hàng vì các giá trị được phân trang. Tôi đang sử dụng MySQL 5, nhưng tôi nghĩ rằng điều này khá chung chung.

+0

[Sử dụng các truy vấn phụ để tính riêng biệt nhanh hơn 50 lần.] (Https: // www.periscopedata.com/blog/use-subqueries-to-count-distinct-50x-faster.html) – bishop

Trả lời

53

Có một giải pháp tốt đẹp trong MySQL.

Thêm SQL_CALC_FOUND_ROWS từ khóa ngay sau từ khóa CHỌN:

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

Sau đó, chạy một truy vấn với FOUND_ROWS function():

SELECT FOUND_ROWS(); 

Nó sẽ trả về số hàng mà không có sự Mệnh đề LIMIT.

Thanh toán trang này để biết thêm thông tin: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

+3

Với tuyên bố từ chối trách nhiệm rằng tôi chưa tự chấm điểm các cuộc gọi, bài viết này đã tắt tôi khỏi giải pháp: http: // www .mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-to-sql_calc_found_rows/ –

+0

Thay vì thực hiện nhiều truy vấn, vui lòng http://stackoverflow.com/a/364838/631652 cho câu trả lời của Tom. – Parixit

50

Có phải "bunch of stuff khác" tất cả các uẩn? Tôi giả sử như vậy kể từ khi GROUP BY của bạn chỉ có t3.id. Nếu đó là trường hợp thì điều này nên làm việc:

SELECT 
    COUNT(DISTINCT t3.id) 
FROM... 

Các tùy chọn khác của khóa học là:

SELECT 
    COUNT(*) 
FROM 
    (
    <Your query here> 
    ) AS SQ 

tôi không sử dụng MySQL, vì vậy tôi không biết nếu các truy vấn này sẽ làm việc ở đó hoặc không phải.

+2

Trong MySQL, lỗi này có thể là một giải pháp ok nếu bạn thêm bí danh cho bảng được tạo ra. Nếu không, bạn sẽ gặp lỗi: "Mọi bảng dẫn xuất phải có bí danh riêng". Vì vậy, hãy chắc chắn để viết một cái gì đó như: chọn số (*) từ (truy vấn của bạn) như là kết quả Bảng – Kennethvr

+0

Cảm ơn bạn đã đứng đầu. Tôi đã thực hiện chỉnh sửa. –

+5

hoạt động trong MySQL cho tôi. – quano

12

Sử dụng truy vấn phụ:

SELECT COUNT(*) FROM  
(
SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
)  
as temp; 

để tạm chứa số lượng hàng.

1

Tất cả ans đã cho sẽ thực hiện truy vấn và sau đó tìm số lượng. Khác biệt rõ ràng là chậm hơn so với nhóm theo số liệu lớn.

Cách tốt nhất để tìm ra số của nhóm bởi dưới

SELECT 
    sum(1) as counttotal 
FROM (
    Your query with group by operator 
) as T 

này sẽ tìm ra đếm trong khi tính toán nhóm bằng.

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