한 필드의 개수가 1보다 큰 경우 선택


100

다음과 같이하고 싶습니다.

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

MySql에서 어떻게 이것을 달성 할 수 있습니까?

답변:


146

집계 결과 비교를 위해 HAVING, not WHERE절을 사용하십시오 .

액면가에서 쿼리 취하기 :

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

이상적으로 GROUP BYHAVING절 에서 적절한 평가를 위해 정의 되어야 하지만 MySQL은 GROUP BY ...

에 대한 고유 한 제약 조건을 준비하는 중 someField입니까? 그래야 할 것 같은데 ...


11
GROUP BY확실히 필요 합니까 (이것은 MySQL이 아닌 표준이 아닌 한)?
Martin Smith

@Martin Smith : 액면가로 쿼리를 수행했습니다. GROUP BY 문제 해결 (숨겨진 열 기능 포함).
OMG Ponies

"그럴 것 같은데 ..."왜? 나는이 :)에 대한 교육을 필요로입니다
데이브

따라서 2 개 이상의 null이 아닌 someField값 이 포함 된 경우 전체 테이블을 반환하고 그렇지 않은 경우 빈 결과 집합을 반환합니다.
Martin Smith

@Dave : 잘못된 데이터를 주기적으로 확인하고 수정해야하는 위치에 있었다면 처음부터 상황이 발생하는 것을 막고 싶지 않습니까? MySQL은 인덱스로 고유 한 제약 조건을 구현합니다. 자세한 내용은 CREATE INDEX 문서
OMG Ponies

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
여기서 유일한주의 사항은 (최소한 5.1.46-community MySQL Community Server (GPL)에서) "모든 파생 테이블에는 고유 한 별칭이 있어야합니다"라는 것입니다. 그러면 SQL이 다음과 같이 표시됩니다. SELECT username, numb from (Select username, count (username) as numb from customers GROUP BY username) as my_table WHERE numb> 3
D_K

14

셀프 조인으로도이 작업을 수행 할 수 있습니다.

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk

11

여기 있습니다 :

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc

4

일방 통행

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)

1

OMG Ponies가 말했듯이 having 절은 당신이 추구하는 것입니다. 그러나 요약 대신 불연속 행을 얻고 자했다면 ( "가져있는"요약이 요약을 생성 함) 단일 문으로 수행 할 수 없습니다. 이 경우 두 개의 문을 사용해야합니다.


1
완전히 사실이 아닙니다. HAVING이 사용하는 것을 조작하려면 GROUP BY를 사용하십시오.
OMG Ponies

1

Sql의 두 테이블 사이에 Group By에 대한 예제를 제공합니다.

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

나를 위해, 그냥 빈 결과를 반환하는 그룹이 없습니다. 그래서 나는 having 진술을 위해 그룹을 갖는 것이 매우 중요하다고 생각합니다.


-2

또한 "pk"가 키 필드 여야한다는 것도 언급해야합니다. 셀프 조인

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

Bill Karwin은 내가 원했던 모든 중복 기록을 제공합니다. 일부는 둘 이상을 가지고 있기 때문에 동일한 레코드를 두 번 이상 얻을 수 있습니다. 키 필드 억제로 동일한 레코드를 제거하기 위해 동일한 필드가있는 다른 테이블에 모두 썼습니다. 나는 시도했다

SELECT * FROM db.table HAVING COUNT(someField) > 1

먼저. 그것에서 반환 된 데이터는 중복 중 하나만 제공합니다. 이것이 제공하는 것의 1/2 미만이지만 원하는 것이 전부라면 개수가 좋습니다.


3
이것은 실제로 대답이 아닙니다.
anon582847382
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.