2012-01-28 39 views
5

Tôi có bảng người dùng (người dùng, vượt qua, email) và tôi muốn nhận số người dùng trong đó user = 'someuser' và số lượng email mà email = 'someemail' trong một truy vấn và tôi đã nghĩ ra điều đó:Chọn hai số trong một truy vấn

SELECT (

SELECT COUNT(user) 
FROM users 
WHERE user = 'someuser' 
), (

SELECT COUNT(email) 
FROM users 
WHERE email = 'someemail' 
) 
FROM users 

Nhưng tôi tự hỏi liệu có cách nào tốt hơn để làm điều đó không? Cảm ơn trước :)

+0

Tôi không nghĩ rằng có hai cột tổng hợp trên hai bảng khác nhau hoạt động mà không có cách tiếp cận truy vấn phụ này, vì vậy tôi nghĩ giải pháp của bạn là ok. – Gregor

+0

hãy xem [câu trả lời này] (http://stackoverflow.com/a/5177386/944634) –

+0

@ParagBafna: đó là một cách tiếp cận tốt, và tôi lưu ý rằng nó yêu cầu "xúc tiến" của MySQL về các phép toán thành các kiểu tách rời. (Chúng tôi không biết rằng RDBMS của lam3r4370 thực hiện điều này.) – pilcrow

Trả lời

8

Không, đó là cách chính xác để thực hiện trong trường hợp của bạn. Số lượng của bạn có thể sẽ luôn là 0 hoặc 1 và được thỏa mãn từ chỉ mục NC.

Trong trường hợp bạn muốn quét nhiều dữ liệu hơn, nó có thể hiệu quả hơn để làm điều đó như thế này:

select sum(case when user = 'x' then 1 end) UserCount, sum(case when email = 'x' then 1 end) EmailCount 
from users 

này sẽ luôn luôn quét bàn. Nó phụ thuộc vào dữ liệu mà phiên bản nhanh hơn. Trong trường hợp của bạn, máy của bạn nhanh hơn.

+0

Giải pháp của bạn tồi tệ hơn giải pháp được đề xuất trong bài đăng gốc. Bởi vì truy vấn của bạn thực hiện quét bảng đầy đủ khi nó không có mệnh đề where. –

+0

@arpf bạn nói đúng rằng việc quét bảng luôn xảy ra (điều đó rất nguy hiểm vì vậy tôi gọi nó ra trong câu trả lời). Phiên bản của tôi là tốt hơn, mặc dù, nếu quét bảng luôn được yêu cầu. Ngoài ra, lưu ý câu đầu tiên - tôi đề cập đến sự cân bằng đó. – usr

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