2012-02-24 24 views
6

Tôi đang thực hiện một số lựa chọn và muốn tính toán chồng chéo. Ví dụ:SQL chọn đa dạng các mục trong union

SELECT id FROM foo WHERE ... 
SELECT id FROM bar WHERE ... 
SELECT id FROM baz WHERE ... 

Gọi các truy vấn này a, b và c tương ứng. Giả sử một số (1,2,3,4,5), b cho (1,3,5), và c cho (4,5,6). Tôi muốn kết hợp những điều này và đếm số lượng. Đối với ví dụ trên, kết quả tôi đang tìm kiếm là

id | multiplicity 
----------------- 
1 | 2 
2 | 1 
3 | 2 
4 | 2 
5 | 3 
6 | 1 

Làm cách nào để thực hiện điều này trong MySQL5 trong một truy vấn? (Các phần a, b và c có thể là các lựa chọn đơn giản hoặc các thủ tục được lưu trữ).

+0

Bạn đã cố định số lượng bảng và mục nhập hoặc chúng có thể thay đổi? Bạn có thể thay thế mỗi ID bị thiếu bằng 0 và sau đó tổng hợp các phần tử đầu tiên, thứ hai, thứ ba, v.v ... Mặc dù không phải là một giải pháp thanh lịch – Andrew

+0

Tôi thích tính đa dạng ... – Ben

Trả lời

7

tôi không thể xác minh điều này vào lúc này, nhưng tôi tin rằng điều này sẽ làm việc

SELECT id, count(id) AS multiplicity 
FROM 
(
    SELECT id FROM foo WHERE ... 
    UNION ALL 
    SELECT id FROM bar WHERE ... 
    UNION ALL 
    SELECT id FROM baz WHERE ... 
) AS TablesTogether 
GROUP BY id 
+0

Cảm ơn bạn. Bạn có biết tôi có thể thêm trọng số cho điều này không, ví dụ: với trọng số 3 trên 'baz' ví dụ của tôi sẽ kết thúc bằng' id = 5, multiplicity = 5; id = 6, multiplicity = 3'? – spraff

+0

Something như thế này: SELECT id, sum (fullcount) AS đa TỪ ( SELECT id, (count (id) * Trọng lượng) như fullcount TỪ nhóm #foo bởi id, trọng lượng UNION ALL SELECT id, (đếm (id) * trọng lượng) dưới dạng số lượng tối đa từ nhóm #bar theo id, trọng số UNION ALL id CHỌN, (số (id) * trọng lượng) là số lượng đầy đủ TỪ nhóm #baz theo id, trọng số ) AS TablesTogether GROUP BY id –

0

Dưới đây là một phiên bản được định dạng của giải pháp cân đối (weight_Fooweight_Bar là hằng số)

SELECT id, sum(fullcount) AS multiplicity 
FROM (
    SELECT id, weight_Foo as fullcount FROM Foo WHERE ... 
    UNION ALL 
    SELECT id, weight_Bar as fullcount FROM Bar WHERE ... 
) AS TemporaryTableName 
GROUP BY id 
Các vấn đề liên quan