2011-05-09 41 views
3

我复制,从一个表中的一些记录到另一个 这个查询:MySql的删除 - 同样喜欢选择(加盟)

insert into pages_finished (keyword,pages,resultlist,done,current) 
select keyword,pages,resultlist,done,current 
from pages_done o 
where (select count(*) as totalPages from pages_done x where x.keyword = o.keyword)-1 = pages 

现在我想从源表中删除相同的记录, 我在想它会很简单,因为:

delete from pages_done o 
where (select count(*) as totalPages from pages_done x where x.keyword = o.keyword)-1 = pages 

但这不起作用。 谁能告诉我什么是这样做的正确方法?

@bgdrl回答之后,我正在考虑只运行select, 获取应该复制的所有记录的ID, 然后删除; 但我认为必须有一个更简单的解决方案,任何人?

即使明显@bgdrl答案正确的答案, 这只是因为一个事实。

感兴趣的人与我落得这样做: 我做了同样的选择,我开始用(但只选择ID列,因为选择的所有列会杀了我可怜的电脑), 它导出到INSERT STATMENTS (使用mysqlworkbench), 打开记事本中的文本文件, 替换全部INSERT INTO ...用DELETE FROM WHERE ID=, 并在mysql中运行该查询。

我觉得这么愚蠢采用这种方式,但显然没有别的选择。

+0

为什么你不用mysql'LAST_INSERT_ID()' – diEcho 2011-05-09 07:56:50

+1

@diEcho来处理这个问题,因为'LAST_INSERT_ID()'只返回一个值,而INSERT语句可以插入很多行。 – 2011-05-09 08:12:45

回答

0

请按照以下步骤备份表格。

按照如下步骤

STEP 1

CREATE TABLE pages_done_ids 
    SELECT o.id FROM pages_done AS o 
    WHERE 
    (
     SELECT count(*) AS totalPages 
     FROM pages_done AS x 
     WHERE x.keyword = o.keyword 
    )-1 = o.pages 

STEP 2

DELETE FROM pages_done AS o 
WHERE o.id IN (SELECT id FROM pages_done_ids) 

步骤3

DROP TABLE pages_done_ids; 

OK,你可以使用一个​​交易完成它。

快乐查询!

+0

这看起来像个好主意! – Dementic 2011-05-12 20:21:34

+0

检查SQL,只是盲目写它。 – Igor 2011-05-12 21:28:18

+0

稍作修改,这是我需要:) 谢谢! – Dementic 2011-05-12 22:41:12

2

从mysql网站:“你不能修改表并从子查询中的同一个表中选择,这适用于诸如DELETE,INSERT,REPLACE,UPDATE之类的语句。 http://dev.mysql.com/doc/refman/5.1/en/subqueries.html

+1

OK bgdrl,这是伟大的知道,但我仍然需要一个解决方案。 有没有人有一个想法如何解决这个问题? – Dementic 2011-05-09 08:28:28

+0

你为什么需要这个条件?其中x.keyword = o.keyword)-1 =页面。你想过滤什么? – dabuno 2011-05-09 08:46:49

+0

基本上它会比较特定关键字的总行数并将其与应匹配的pages列进行比较。 -1是因为这些行还包含页码0. – Dementic 2011-05-09 10:30:48