2012-06-21 19 views
5

Tôi có một bảng mà từ đó tôi cần phải chọn tất cả những người có tên đầu tiên không phải là duy nhất và tập hợp đó sẽ chỉ được chọn nếu trong số những người có tên tương tự, tất cả đều có tên cuối cùng khác nhau.Sử dụng HAVING trong MySQL

Ví dụ:

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 
Elvis  Presley 
Elvis  Presley 
Largo  Winch 

Tôi muốn để có được

FirstN LastN 
Bill  Clinton 

hoặc

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 

tôi đã cố gắng này, nhưng nó không trả lại những gì tôi muốn.

SELECT * FROM Ids 
GROUP BY FirstN, LastN 
HAVING (COUNT(FirstN)>1 AND COUNT(LastN)=1)) 

[Sửa bài viết của tôi sau khi Aleandre P. Lavasseur nhận xét]

+0

Hãy thử concatenating tên đầu tiên và cuối cùng. Xem câu trả lời của tôi dưới đây. –

Trả lời

7
WITH duplicates AS (
    SELECT firstn --, COUNT(*), COUNT(DISTINCT lastn) 
    FROM ids 
    GROUP BY firstn 
    HAVING COUNT(*) = COUNT(DISTINCT lastn) 
     AND COUNT(*) > 1 
) 
SELECT a.firstn, a.lastn 
    FROM ids a INNER JOIN duplicates b ON (a.firstn = b.firstn) 
    ORDER BY a.firstn, a.lastn 

Nếu mysql không hỗ trợ VỚI, sau đó bên trong truy vấn:

SELECT a.firstn, a.lastn 
    FROM ids a 
     ,(SELECT firstn --, COUNT(*), COUNT(DISTINCT lastn) 
      FROM ids 
      GROUP BY firstn 
      HAVING COUNT(*) = COUNT(DISTINCT lastn) 
      AND COUNT(*) > 1 
     ) b 
    WHERE a.firstn = b.firstn 
    ORDER BY a.firstn, a.lastn 
+0

Tôi nghĩ rằng MySQL không hỗ trợ 'WITH' – bfavaretto

+0

@bfavaretto được, cập nhật cho phù hợp, nhờ – Glenn

+0

Bạn cần bí danh cho' COUNT (*) 'và' COUNT (DISTINCT lastn) '. Bạn cũng có thể thả chúng hoàn toàn chọn –

3

bạn có thể thử này:

SELECT A.FirstN, B.LastN 
FROM (
SELECT FirstN 
FROM Ids 
GROUP BY FirstN 
HAVING (COUNT(FirstN)>1) 
) AS A 
INNER JOIN Ids B ON (A.FirstN = B.FirstN) 
GROUP BY A.FirstN, B.LastN 
HAVING COUNT(B.LastN)=1 
+1

đây là [mẫu đang hoạt động] (http://sqlfiddle.com/#!3/c0c6e/4) –

0

Bạn có thể thử ably làm điều này ...

SELECT FirstN + LastN as FullName, COUNT(*) 
FROM Ids 
GROUP BY FirstN + LastN 
HAVING COUNT(*) > 1 

Hãy chắc chắn kiểm tra các giá trị rỗng vì nó sẽ vô hiệu hóa nối.

+0

Ghép nối như vậy trả về cero cho tôi, bạn có nên sử dụng CONCAT (FirstN, LastN) để nối trên My Sql không? – Jcis

+0

Xin lỗi. Tôi là một anh chàng MS SQL. Tôi đã chỉ gợi ý concat như là một lựa chọn cho vấn đề của OP. –

0

tương tự để trả lời 2 nhưng bị chỉ đầu tiên ghi lại vị trí lặp đi lặp lại tên (kết quả đầu tiên bạn nói bạn muốn để có được)

select T.FirstN, T.LastN from (
     select FirstN, LastN from Ids 
    group by FirstN, LastN 
     having count(1) = 1) T 
group by FirstN 
having count(1) > 1; 
Các vấn đề liên quan