2011-09-01 34 views
5

Thông thường tôi cảm thấy khá tự tin với các truy vấn SQL, tuy nhiên điều này khiến tôi gãi đầu. Tôi cảm thấy như thế này - có thể là một sửa chữa nhanh chóng, nhưng tôi chỉ không nhìn thấy nó.MySQL: Cách tính từ các cột riêng biệt?

Tôi đang cố gắng đếm trên nhiều giá trị trên cùng một bảng, trong một truy vấn.

Đừng bận tâm "0000000000000000" nó chỉ đại diện cho một mảng byte trống.

Có cách nào dễ dàng để kết hợp các truy vấn này không?

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 

SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 

SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 

etc... 

Trả lời

2

Bạn có thể làm một cái gì đó như thế này -

SELECT COUNT(ssn) AS patient_count, 'ssn' AS count_type 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) AS patient_count, 'firstname' AS count_type 
FROM patients 
WHERE firstname="0000000000000000" 
UNION 
SELECT COUNT(lastname) AS patient_count, 'lastname' AS count_type 
FROM patients 
WHERE lastname="0000000000000000" 
+0

Có cách nào để tôi có thể xoay bảng không? Ý tôi là sẽ tốt hơn nếu có gạch của tôi làm tiêu đề chứ không phải giá trị. – theangryhornet

+2

Bạn có thể đặt UNION ALL thay vì UNION, chỉ để lưu máy chủ SQL một chút công việc thừa. – James

1

Hãy thử với UNION

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 
UNION  
SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 
+2

Bạn muốn sử dụng 'UNION ALL' tại đây. Nếu hai (hoặc thậm chí cả ba) số lượng xảy ra là giống nhau, 'UNION' sẽ loại bỏ chúng là trùng lặp. –

+0

Không chắc chắn nếu tôi thích cái này, vì bạn không thể phân biệt số đếm nào. – theangryhornet

+0

bạn có thể đặt một cột khác với mô tả để giải quyết điều này –

6
SELECT SUM(CASE WHEN ssn = '0000000000000000' THEN 1 ELSE 0 END) AS ssn_count, 
     SUM(CASE WHEN firstname = '0000000000000000' THEN 1 ELSE 0 END) AS first_count, 
     SUM(CASE WHEN lastname = '0000000000000000' THEN 1 ELSE 0 END) AS last_count 
    FROM patients 
    WHERE ssn = '0000000000000000' 
     OR firstname = '0000000000000000' 
     OR lastname = '0000000000000000' 
+0

Đó là khá darned mát mẻ. Làm thế nào để bạn nghĩ rằng nó so sánh trong hiệu suất cho các giải pháp "công đoàn" dưới đây? – Marvo

+3

@Marvo: Câu trả lời chuẩn của tôi là thử cả hai và so sánh. Tôi cho rằng điều này sẽ tốt hơn vì nó là 1 lựa chọn so với 3. –

+0

cách tiếp cận rất thú vị! – theangryhornet

1

Tôi đoán đây sẽ làm việc?

SELECT * 
FROM 
(SELECT COUNT(ssn) AS ssn_count 
FROM patients 
WHERE ssn="0000000000000000") AS ssn 
CROSS JOIN 
(SELECT COUNT(firstname) AS firstname_count 
FROM patients 
WHERE firstname="0000000000000000") AS firstname 
CROSS JOIN 
(SELECT COUNT(lastname) AS lastname_count 
FROM patients 
WHERE lastname="0000000000000000") AS lastname 
Các vấn đề liên quan