2015-05-28 11 views
8

Tôi có một bảng những người có tên, địa điểm (nơi họ sinh sống) và một parent_id (cha mẹ được lưu trữ trên một bảng khác). Vì vậy, ví dụ:Đếm các bản ghi SQL dựa trên thuộc tính anh chị em

name | location | parent_id 
--------+-----------+----------- 
Joe  | Chicago | 12 
Sammy | Chicago | 13 
Bob  | SF  | 13 
Jim  | New York | 13 
Jane | Chicago | 14 
Dave | Portland | 14 
Al  | Chicago | 15 
Monica | Boston | 15 
Debbie | New York | 15 
Bill | Chicago | 16 
Bruce | New York | 16 

tôi cần phải đếm có bao nhiêu người sống ở Chicago và có anh chị em (chia sẻ một PARENT_ID) sống tại New York. Vì vậy, cho ví dụ trên, số lượng sẽ là 3.

name | location | parent_id 
--------+-----------+----------- 
Joe  | Chicago | 12 
Sammy | Chicago | 13 * sibling Jim lives in New York 
Bob  | SF  | 13 
Jim  | New York | 13 
Jane | Chicago | 14 
Dave | Portland | 14 
Al  | Chicago | 15 * sibling Debbie lives in New York 
Monica | Boston | 15 
Debbie | New York | 15 
Bill | Chicago | 16 * sibling Bruce lives in New York 
Bruce | New York | 16 

Ai đó có thể giúp tôi viết SQL để truy vấn số này?

Trả lời

1

Truy vấn tương quan là một cách rất hay để đi và rất hiệu quả. Tránh sử dụng khác biệt vì nó là một hoạt động tốn kém. Nhóm theo là một lựa chọn tốt đẹp về việc sử dụng riêng biệt. Hiểu dữ liệu và cấu trúc truy vấn cho phù hợp. Đây là một tùy chọn khác được tối ưu hóa động cơ ...

select count(*) 
from (select * from #t where Location = 'Chicago') ch 
inner join (select * from #t where Location = 'New York') ny on ch.ParentID = ny.ParentID 
+0

Đó không phải là một truy vấn con tương quan, chúng chỉ là truy vấn phụ, và câu trả lời của bạn cũng gặp phải vấn đề tương tự của PD1ce ban đầu; nó sẽ đếm người ở Chicago với anh chị em N ở New York N lần. – Uueerdo

1

Có thể thử điều này?

SELECT Count(*) 
FROM table table1 
WHERE table1.location= 'Chicago' 
     AND EXISTS (SELECT * FROM table table2 
        WHERE table1.parent_id= table2.parent_id 
          AND table2.location= 'New York') 
3

Có vẻ như câu trả lời của Minh hoạt động tốt, nhưng đây là một ví dụ khác sử dụng Tự tham gia.

SELECT Count(DISTINCT a.child_id) 
FROM people a 
    JOIN people b ON a.parent_id = b.parent_id 
WHERE a.location = 'Chicago' AND b.location = 'New York' 

Nên tạo "3" cho bảng ở trên được liệt kê.

CHỈNH SỬA: Đã thêm dấu cách a.parent_id dựa trên đề xuất của Lithis.

EDIT2: Theo ghi nhận của Uueerdo, một child_id hoặc một số loại id duy nhất sẽ thực sự giúp đỡ trong trường hợp của 2 anh chị em sống ở Chicago và 1 anh chị em sống ở New York. Tôi đã chỉnh sửa truy vấn ban đầu để phản ánh điều này.

Vì đây không thực sự là một "câu trả lời" cho câu hỏi của bạn, bởi vì không có child_id như vậy, tôi sẽ trì hoãn câu trả lời của Uueerdo, xin lỗi!

+0

Tôi chưa chạy truy vấn, nhưng dường như nó sẽ tính một người hai lần nếu họ có hai anh chị em khác nhau ở New York. Có lẽ việc thêm 'GROUP BY a.id' hoặc sử dụng' COUNT (DISTINCT a.id) 'sẽ ngăn chặn điều này. – Lithis

+0

Bạn chính xác là Lithis, không bắt được điều đó. Tôi sẽ chỉnh sửa bài đăng của mình. – PD1ce

+0

Bạn thực sự cần một "id con", nếu hai người ở Chicago có cùng cha mẹ, họ sẽ chỉ được tính một lần ngay bây giờ. Trên thực tế, 'COUNT (DISTINCT a. *)' Có thể hoạt động không? – Uueerdo

1
SELECT COUNT(*) 
FROM `people` AS p1 
WHERE p1.`location` = 'Chicago' 
     AND p1.parent_id IN (
     SELECT DISTINCT parent_id 
     FROM `people` AS p2 
     WHERE p2.`location` = 'New York' 
     ) 
; 

Sử dụng Minh làm cơ sở, điều này sẽ khá nhanh; vì truy vấn phụ không còn "tương quan" nữa, nên không nên mạo hiểm khả năng nó cần được thực thi nhiều lần, một lần cho mỗi hàng trong people.

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