2010-02-14 1 views
3

У меня проблема с этим запросом mysql. Он принимает vmore как 1 день, чтобы выполнить ...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 
    ) 
); 

Я сделал объяснить продлен на 2 выбора, и он говорит Зависимый подзапрос поэтому второй выбор воспроизводятся для каждого выбор на но я думаю, что это бесполезно.

Есть ли способ в mysql или другом сервере sql, который может это позволить?

Или, может быть, завершить другой запрос.

Идея состоит в том, что если город не имеет профессии, название города должно быть записано в таблице результатов. Тогда мне просто нужно посмотреть в таблице, а не на городском столе.

ответ

2

Вы можете попробовать что-то вроде этого

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 
); 

Также убедитесь, что у вас есть правильные индексы по таблицам, для позволяет говорить traduction.type или traduction.id и cities.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 
); 

EDIT: НЕ СУЩЕСТВУЕТ 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

больше нет зависимости, но я не думаю, что это сделано, что я хочу. как могут быть города.id = s.id и s.ID IS NULL? Я не могу присоединиться, потому что city.id не существует в таблице traduction. Я хочу создать его с помощью этого запроса. – Charles

+0

Этот запрос приведет к возврату всех предметов из городов, которые не существуют в процессе обучения. Вот почему я упоминаю ** LEFT JOIN и NULL ** check –

+0

О, хорошо, я понимаю спасибо. Я пробовал это – Charles

0

Вы изменяете Traduction таблицы, поэтому результаты внутреннего подзапроса не могут быть повторно использованы

+0

не существует способа заставить кэш? Как (выберите * FROM tracution) как traduction_query, а затем используйте traduction_query как список или что-то в этом роде ... Может быть, мне нужно создать функцию или процедуру? – Charles

 Смежные вопросы

  • Нет связанных вопросов^_^