mysql查询太久了

时间:2010-02-14 14:23:39

标签: mysql subquery

我有这个mysql查询的问题。它需要花费1天才能执行...

查询是:

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选择上做了一个扩展解释,然后说DEPENDENT SUBQUERY,所以第二个选择是针对城市的每个选择进行的,但我认为它没用。

在mysql或其他sql server中有一种方法可以允许吗?

或者也许是complet其他查询。

这个想法是,如果一个城市没有一个转义,城市名称应该写在traduction表中。然后我只需要看看traduction表而不是城市表。

2 个答案:

答案 0 :(得分: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
);

编辑:不存在

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

答案 1 :(得分:0)

您正在修改traduction表,这就是内部子查询的结果无法重用的原因