php – 删除重复项并在一个语句中更新一个唯一的左侧?
CREATE TABLE hostname_table ( id INT NOT NULL AUTO_INCREMENT,hostname CHAR(65) NOT NULL,interval_avg INT,last_update DATETIME NOT NULL,numb_updates INT,PRIMARY KEY (id) ) 我有这个表,我将500-600k行数据导入其中.在写入数据库时??,我不检查重复项,因为我想知道每个主机有多少重复项,并且我还想知道每个主机名更新之间的间隔. hostname_table中的示例值: id hostname interval_avg last_update numb_updates 1 www.host.com 60 2012-04-25 20:22:21 1 2 www.hostname.com 10 2012-04-25 20:22:21 5 3 www.name.com NULL 2012-04-25 20:22:21 NULL 4 www.host.com NULL 2012-04-25 20:22:26 NULL 5 www.host.com NULL 2012-04-25 20:22:36 NULL 我清理它时我想要它的样子: id hostname interval_avg last_update numb_updates 1 www.host.com 25 2012-04-25 20:22:36 3 2 www.hostname.com 10 2012-04-25 20:22:21 5 3 www.name.com NULL 2012-04-25 20:22:21 NULL 有了这样一个庞大的数据库,我不想发送太多的查询来获得这个目标,但我相信3个查询是这样的操作的最小值(如果我错了,请纠正我).每小时将有大约50万个新行,其中~50%或更多将是重复的,因此尽可能有效地去除那些重复项是至关重要的,同时仍然记录重复发生的次数和频率(hense the interval_avg和numb_update更新). 这是一个三步问题,我希望这里的社区能伸出援助之手. 所以总结一下伪代码,我需要帮助优化这些查询; >选择所有last_update和interval_avg值,获取sum(numb_update),获取计数(重复)foreach主机名, SOLVED. (感谢GolezTrol帮助解决部分问题) 解决方法
如果要按主机名聚合,则无法为主机名获取interval_avg和numb_updates的每个不同值.你的意思是SUM还是AVG呢?或者你只想保持最低身份证的价值?
在下面的查询中,我总结了它们. SELECT MIN(id) as id,hostname,SUM(interval_avg) as total_interval_avg,SUM(numb_updates) as total_numb_updates,COUNT(*) as hostname_count FROM hostname_table GROUP BY hostname 在此之后,您将需要使用interval_avg和numb_updates的正确值更新每个找到的id. 之后,您将需要删除此查询找不到的每个ID. DELETE FROM hostname_table WHERE id NOT IN (SELECT MIN(id) FROM hostname_table GROUP BY hostname) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |