2010-02-14 4 views
3

이 mysql 쿼리에 문제가 있습니다. mysql이 너무 긴 쿼리

INSERT INTO traduction 
(traduction.`id`,traduction.`traduction`,traduction.`language`,traduction.`type`) 
(
SELECT cities.id,cities.name, '', 'city' FROM cities 
    WHERE cities.id NOT IN 
    (
    SELECT traduction.`id` FROM traduction WHERE traduction.type='city' GROUP BY id 
    ) 
); 

가 나는이 두 선택에 확장 설명했다 그것은에 선택 두 번째 선택은 모든에 대한 재생되도록 DEPENDENT 하위 쿼리를 말한다 : 그것은

쿼리는 ... 실행하는 일일로 vmore을 도시라고 생각하지만 쓸모가 없다고 생각합니다.

mysql 또는 다른 SQL 서버에서이를 허용 할 수있는 방법이 있습니까?

또는 다른 검색어 일 수도 있습니다.

도시에 traduction이없는 경우, 도시 이름을 traduction 테이블에 써야합니다. 그렇다면 나는 단지 표 (traduction table)가 아닌 도시 표 (cities table)를 봐야합니다. 내부 서브 쿼리의 결과는 또한 당신이 당신의 테이블에 대한 올바른 인덱스를 가질 수 있도록 당신을 위해,이

INSERT INTO traduction 
(traduction.`id`,traduction.`traduction`,traduction.`language`,traduction.`type`) 
( 
SELECT cities.id, 
     cities.name, 
     '', 
     'city' 
FROM cities LEFT JOIN 
     (
      SELECT traduction.`id` 
      FROM traduction 
      WHERE traduction.type='city' 
      GROUP BY id 
     ) s ON cities.id = s.id 
WHERE s.ID IS NULL 
); 

뭔가를 시도 할 수 있습니다

답변

2

을 재사용 할 수없는 이유 당신은 어 번역 테이블을 수정하는

+0

더 의존성은 없지만 나는 그것이 내가 원하는 것이라고 생각하지 않는다. 어떻게 cities.id = s.id 및 s.ID IS NULL이 될 수 있습니까? cities.id가 번역 표에 존재하지 않으므로 가입 할 수 없습니다. 나는이 쿼리로 그것을 만들고 싶다. – Charles

+0

이 쿼리는 번역에 존재하지 않는 도시의 모든 항목을 다시 가져옵니다. 그래서 ** LEFT JOIN과 IS NULL ** 체크를 언급합니다. –

+0

오, 알았습니다. 감사합니다. 나는 그것을 시도 – Charles

0

, 즉이다 traduction.type 또는 traduction.id을 말하고

INSERT INTO traduction 
(traduction.`id`,traduction.`traduction`,traduction.`language`,traduction.`type`) 
( 
SELECT cities.id, 
     cities.name, 
     '', 
     'city' 
FROM cities LEFT JOIN 
     (
      SELECT DISTINCT 
        traduction.`id` 
      FROM traduction 
      WHERE traduction.type='city' 
     ) s ON cities.id = s.id 
WHERE s.ID IS NULL 
); 

편집을 cities.id 수 있습니다 : 존재하지 S

INSERT INTO traduction  
(traduction.`id`,traduction.`traduction`,traduction.`language`,traduction.`type`) 
( 
SELECT cities.id, 
     cities.name, 
     '', 
     'city' 
FROM cities 
WHERE NOT EXISTS (
         SELECT DISTINCT 
           traduction.`id` 
         FROM traduction 
         WHERE traduction.type='city' 
         AND  cities.id = traduction.id 
        ) 
); 
+0

캐시를 강제로 수행 할 방법이 없습니까? (* FROM tracution을 선택하십시오)을 traduction_query로 사용한 다음 traduction_query를 목록 또는 이와 비슷한 것으로 사용하십시오 ... 아마도 함수 또는 프로 시저를 작성해야합니까? – Charles