我有一张约800,000行的表。我正在尝试运行以下语句,旨在选择某些行并将它们插入另一个表中。
INSERT INTO t2 SELECT n2.* FROM t1 AS n1, t1 AS n2
WHERE n1.card_version_id > n2.card_version_id
AND n1.card_id = n2.card_id
AND n1.user_id = n2.user_id;
查询现在运行了两个多小时,但我没有收到任何错误。我之前已经停止了,这也没有给我任何反馈(错误:在<0,1ms之后取消)。
我是SQL的新手,所以如果有人能够向我指出我可能做错了什么以及是否有更好的方法可以做到这一点,我会很高兴。我很抱歉,如果这是微不足道的,但我无法在任何地方找到解释(可能是因为我甚至不确定要寻找什么)
编辑:这些都是表格(结构相同)
CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`card_id` int(10) unsigned NOT NULL,
`ard_version_id` int(10) unsigned NOT NULL,
`amount_have` int(11) DEFAULT NULL,
`amount_want` int(11) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=830447 DEFAULT CHARSET=utf8
CREATE TABLE `t2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`card_id` int(10) unsigned NOT NULL,
`card_version_id` int(10) unsigned NOT NULL,
`amount_have` int(11) DEFAULT NULL,
`amount_want` int(11) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
答案 0 :(得分:1)
您的查询需要更多时间的原因是:交叉加入
正如我所看到的,您确实希望在表格“self join
”上执行T1
,并且您正在借助交叉加入(n1,n2
)执行此操作。 The result of the cross join is (no of rows * no of columns)
。
将cross join
替换为(inner or equi join
),它将解决您的问题。
答案 1 :(得分:0)
试试这个:
INSERT INTO t2
SELECT n1.card_version_id
,n1.card_id
,n1.user_id
--add all other columns of table
FROM t1 n1
INNER JOIN(
SELECT id,MAX(card_version_id)
FROM t1
GROUP BY id
) n2
ON n1.id = n2.id and n1.card_version_id = n2.card_version_id