2012-05-14 19 views
6

Tôi muốn đếm hai điều trong các điều kiện khác nhau trong một truy vấn.MySQL - Đếm hai điều kiện với các điều kiện khác nhau

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 

SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 

tôi cần phải có một số lượng cho các hàng có địa chỉ nhất định và cổng nhất định, và một số RIÊNG cho các hàng rằng có một cái tên nào đó.

Tôi biết rằng tôi có thể làm

SELECT (COUNT*) as count FROM table_name WHERE (address = ? AND port = ?) OR name = ? 

Tuy nhiên đó là một số duy nhất, và tôi cần họ được tách biệt vì vậy tôi có thể hiển thị một thông điệp chính xác hơn cho người dùng.

Làm cách nào để tôi thực hiện việc này? Trợ giúp sẽ được đánh giá cao!

Trả lời

19

gì về đơn giản:

SELECT 
    SUM(IF(name = ?, 1, 0)) AS name_count, 
    SUM(IF(address = ? AND port = ?, 1, 0)) AS addr_count 
FROM 
    table_name 
+0

Tôi nghĩ rằng điều này giống như của bobwienholt trong các điều khoản về hiệu suất, nhưng nếu một trong 'tên',' địa chỉ' hoặc 'cổng' được lập chỉ mục, thì cũng có thể nhanh hơn để thêm các điều kiện này vào mệnh đề WHERE:' WHERE name =? HOẶC (địa chỉ =?AND port =?) ' –

4
SELECT SUM(CASE WHEN Name = ? THEN 1 ELSE 0 END) as name_match 
     , SUM(CASE WHEN Address = ? AND Port = ? THEN 1 ELSE 0 END) as address_match 
FROM table_name 
WHERE (address = ? AND port = ?) OR name = ? 
+0

Từ những gì tôi có thể nói, truy vấn này sẽ nhanh hơn so với hai người kia các giải pháp. Bạn có đồng ý không? – fruitcup

2

Có thể là đơn giản nhất chỉ để làm một Liên minh :

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 
    GROUP BY name 
UNION ALL 
SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 
    GROUP BY address, port 
+0

Tôi chưa bao giờ thực sự sử dụng UNION trước đây, nhưng tôi nghĩ rằng truy vấn của @ bobwienholt sẽ nhanh hơn. Bạn nghĩ sao? – fruitcup

+2

@DrAgonmoray Đó là một câu hỏi hay, và tôi thực sự không biết ... Tôi thực sự có khuynh hướng suy nghĩ theo cách này sẽ nhanh hơn ** nếu ** có chỉ mục trên * tên * cũng như * địa chỉ * hoặc * Hải cảng*. Đếm là rất nhanh cho một cột được lập chỉ mục, trong khi thêm câu lệnh trường hợp có thể yêu cầu quét tất cả các hàng. YMMV :) – McGarnagle

+1

Tôi có xu hướng đồng ý với đánh giá của dbaseman. Tuy nhiên, tôi có xu hướng sử dụng phương pháp của tôi trong các truy vấn mà mệnh đề WHERE đang xem xét các cột khác nhau, sau đó là các giá trị tôi đếm. Trong trường hợp đó, phương pháp của tôi có thể sẽ nhanh hơn. – bobwienholt

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