2010-04-21 5 views
3

이것은 앞으로 나아갈 길이 다. 믿는다 :나는 MySQL을 몹시 싫어한다. (쿼리 작성에 도움이된다)

나는 30,000 개의 행을 가진 테이블을 가지고있다. 내가 SELECT DISTINCT 'location' FROM myTable 일 때 21,000 개의 행을 반환 할 것으로 예상되지만, 그 하나의 열만 반환합니다.

내가 원하는 것은 그것들을 새로운 테이블로 옮기고, 각 매치마다 전체 행을 이동하는 것입니다.

나의 가장 좋은 추측은 SELECT * from (SELECT DISTINCT 'location' FROM myTable) 또는 그와 비슷한 것이지만 막연한 구문 오류가 있다고합니다.

각 DISTINCT 행의 나머지 부분을 가져 와서 한 번에 새 테이블로 옮기는 좋은 방법이 있습니까?

+1

재미있는 질문 제목. :: thumbsup :: – Andrew

+1

downvote? 다행히도 그것은 MySQL의 부족한 기능 때문이었습니다. 유머가 아닙니다. 스택 오버 플로우는 유머가 없습니까? –

답변

8
SELECT * FROM myTable GROUP BY `location` 

또는 반환 된 전체 행에 대해 다른 테이블에

CREATE TABLE foo AS SELECT * FROM myTable GROUP BY `location` 
+2

+1 간결하고 무엇이 요청되었는지; 여전히 distinct는 항상 모든 열에서 별개의 행을 리턴하고 group은 (by mysql) group by에 언급 된 열에 대해서만 구별 된 행을 반환한다는 것을 지적했을 수있다. (그리고 무작위로 다른 집계되지 않은 열을 선택한다. 이것은 mysql 확장이다. 표준에 따라 다른 데이터베이스에서 작업이 다르게 작동합니다) – Unreason

2

고유 수단을 이동합니다. 따라서 당신은 간단하게 사용할 수 있습니다

SELECT DISTINCT * FROM myTable GROUP BY 'location' 

단일 열에 Distinct를 사용하는 것은 많은 의미가 없습니다. 이 모든 열을 반환 쿼리의 일종 있었지만, 위치에 단지 서로 다른 경우의는 간단한 설정

-id- -location- 
1  store 
2  store 
3  home 

다음 내가 있다고 가정 해 봅시다, 어떤 행이 반환 될 것이다? 1 또는 2? 무작위로 선택해야하나요? 이 때문에 DISTINCT는 반환 된 결과 집합의 모든 열에 대해 작동합니다.

1

글쎄, 먼저 반환 할 항목을 결정해야합니다. 위치 값이 같은 경우에도

문제는 아마도, 테이블의 위치 값의 일부 다른 열에서 다른 값이 존재한다는 것입니다 :이 경우

Location  OtherCol StillOtherCol 

Place1  1   Fred 
Place1  89   Fred 
Place1  1   Joe 

하는의 세 행을 선택 하시겠습니까? DISTINCT 위치에 대해 말하면, 서로 다른 세 개의 행을 하나의 행으로 집어 넣을 수 있습니다. 원본 행이 DISTINCT 결과에 더 이상 존재하지 않으므로 원래 행을 원래 테이블로 이동하는 것은 의미가 없습니다 세트. (다른 모든 열이 주어진 위치에 대해 항상 동일하다면 문제는 더 간단합니다. SELECT DISTINCT * FROM YourTable).

당신은 SQL에 (나쁜 IMHO) MySQL의 확장 기능을 사용 할 수있는 다른 컬럼에서 오는 어떤 값 상관하지 않는 경우 :

SELECT *를 YourTable 그룹에서

위치

에 의해 것 정의되지 않은 방식으로 원래 데이터에서 파생 된 다른 열에 대한 위치 및 값이 하나의 결과 집합에 제공됩니다.

0

모든 열에서 동일한 값을 갖는 여러 행에는 의미가 없습니다. 확인 - 질문은 그 상황을 정확히 정정하는 방법 일 수 있습니다.

kram=# select * from foba; 
id | no |  name  
----+----+--------------- 
    2 | 1 | a 
    3 | 1 | b 
    4 | 2 | c 
    5 | 2 | a,b,c,d,e,f,g 

는 매 없음에 대한 샘플 추출한다 (: = 위치)에 대한 (즉, 열 이상 그룹화하고, 최소의 PK로 행을 선택하여

ID가 PK 주도로,이 테이블을 고려 예 :

SELECT * FROM foba WHERE id IN (SELECT min (id) FROM foba GROUP BY no); 
id | no | name 
----+----+------ 
    2 | 1 | a 
    4 | 2 | c 
관련 문제