2015-11-18 14 views
9

Giả sử tôi có một bảng đăng ký:Làm thế nào để kiểm tra xem giá trị tồn tại trong mỗi nhóm (sau khi nhóm bằng)

uid | subscription_type 
------------------------ 
Alex | type1 
Alex | type2 
Alex | type3 
Alex | type4 
Ben | type2 
Ben | type3 
Ben | type4 

Và muốn chọn chỉ những người dùng có nhiều hơn 2 thuê bao nhưng không bao giờ đăng ký với loại 1

Kết quả mong đợi chỉ chọn "Bến".

tôi dễ dàng có thể tìm thấy những người dùng có nhiều hơn 2 lượt đăng ký sử dụng:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 

Nhưng làm thế nào để kiểm tra xem trong một nhóm một số giá trị không bao giờ tồn tại?

Cảm ơn sự giúp đỡ!

+1

'Nhưng làm thế nào để kiểm tra xem trong một nhóm một số giá trị không bao giờ tồn tại 'có lẽ bạn cần phải thêm một? mệnh đề where với 'NOT EXITS (..)'! – wildplasser

+0

Tôi cố gắng này: CHỌN uid TỪ đăng ký cao GROUP BY cid, cung cấp HAVING COUNT (*)> 2 AND NOT EXISTS ( \t CHỌN uid, SUBSCRIPTION_TYPE \t TỪ đăng ký cao \t ĐÂU SUBSCRIPTION_TYPE = 'đổi mới') Nhưng nó không hoạt động, trả về bảng trống – Spivakos

+0

Bạn cần * ghép nối * uid trong truy vấn phụ với truy vấn chính. Sau đó, nó sẽ làm việc. Ngoài ra: nó phải nằm trong mệnh đề 'WHERE', không phải trong mệnh đề có. – wildplasser

Trả lời

10

Hãy thử truy vấn này:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 
    AND max(CASE "subscription_type" WHEN 'type1' THEN 1 ELSE 0 END) = 0 
+0

Đang hoạt động! Cảm ơn các bạn! – Spivakos

0

Tạo Bảng mẫu:

CREATE TABLE subscribes 
(
uid NVARCHAR(MAX), 
subscription_type NVARCHAR(MAX) 
) 

Chèn Values:

INSERT INTO subscribes 
VALUES ('Alex', 'type1'), ('Alex', 'type2'), ('Alex', 'type3'), ('Alex', 'type4'), ('Ben', 'type2'), ('Ben', 'type3'), ('Ben', 'type4') 

SQL Query:

SELECT uid 
FROM subscribes 
GROUP BY uid 
HAVING COUNT(*) > 2 
AND MAX(CASE subscription_type WHEN 'type1' THEN 1 ELSE 0 END) = 0 
.210

Output:

====== 
|uid | 
------ 
|Ben | 
====== 
1

Để kiểm tra xem một cái gì đó không tồn tại, sử dụng NOT EXISTS(...):

SELECT uid 
FROM subscribes su 
WHERE NOT EXISTS (SELECT * 
     FROM subscribes nx 
     WHERE nx.uid = su.uid AND nx.subscription_type = 'type1' 
     ) 
GROUP BY uid HAVING COUNT(*) > 2 
     ; 
Các vấn đề liên quan