2009-11-11 3 views
1

안녕하세요 - 저는 MySQL 멍청입니다. 여러 비즈니스 목록이있는 테이블이 있는데 도시마다 몇 개의 목록이 포함되어 있는지와 함께 고유 한 도시 이름이 들어있는 cities라는 두 번째 테이블을 채우려고합니다.MySQL은 SELECT 문을 사용하여 이중화 키를 삽입합니다.

SELECT city,state,sum(count) 
FROM (
SELECT city,state, 1 AS count FROM listings 
) results 
GROUP BY city 
ORDER BY sum(count) DESC,city; 

그러나, 지금은 테이블을 업데이트 할,하지만 적절한 문을 작동시킬 수없는 것 : 나는 그렇게처럼 나에게이 데이터 벌금을 유도 할 수있는 SELECT 문을 수행 할 수 있어요. 이것은 내가 가진 최신이지만 현재 "그룹 기능을 잘못 사용했습니다"라는 오류가 발생합니다.

INSERT INTO cities(city,state,size) 
SELECT city,state,sum(count) 
FROM (
SELECT city,state, 1 AS count FROM listings 
) results 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), size=sum(count); 

도움을 주시면 감사하겠습니다.

답변

3

이 작업만큼 간단할까요?

insert into cities (city, state, size) 
select city, state, count(*) as size from listings 
group by city, state 

group by

on duplicate key에 대한 필요가 없도록에는 중복이 없는지 확인해야합니다. count (*)를 시도하는 것처럼 보이는 sum() + subquery가 발생했습니다.

크기 = 합계 (개수) 때문에 특정 오류가 발생했습니다. 일괄 삽입에서 올바른 작업 방법은 size = values ​​(size)입니다. 문서의 내용은 values()입니다.

편집 :

그 다음 어쨌든 아무것도하지 않습니다 도시와 중복 키에 고유 인덱스가없는 각 도시의 또 다른 항목을 추가 있다면.

(도시, 주)에 고유 색인을 추가하면 on duplicate key update size=values(size)을 위 쿼리에 추가하면 각 레코드가 업데이트됩니다.

+0

나는 우리가 방금 동일한 쿼리를 게시했다고 생각합니다. – Dereleased

+0

흠,이 작동하지만 각 중복 도시 대 이전 항목을 업데이트하는 다른 항목을 추가하는 것으로 보인다. 나는 그것이 "ON DUPLICATE KEY UPDATE"명령문의 부분을 가짐으로써 내가 얻었던 것 같다. – sepulturkey

+0

테이블을 먼저 TRUNCATE 할 때 DUPLICATE KEY가 필요하지 않습니다. 그러나 UN 중복 키 (실제로는 나쁜 접근 방식이 아님)를 원한다면 (도시, 주) PRIMARY 또는 UNIQUE 키가 있어야합니다. – longneck

0

시험해보기 전에 테스트해볼 수 있으면 좋겠지 만 시험해보십시오.

insert into cities (city, state, size) 
select city, state, count(*) AS size 
from listings 
group by city, state