1

我需要一个查询来遍历数据库中的每个条目,检查单个值是否在数据库的其他地方重复,如果是 - 删除两个条目(或全部,如果超过两个)。

问题是条目是 URL,最多 255 个字符,无法识别行。由于性能限制,Stack Overflow 上的一些现有答案对我不起作用,或者它们使用的 uniqueid 在处理字符串时显然不起作用。

长版:

我有两个包含 URL(并且只有 URL)的数据库。一个数据库有大约 3,000 个网址,另一个有大约 1,000 个。

但是,这 1,000 个 url 中的大部分来自 3,000 url 数据库。我只需要将 1,000 合并到 3,000 作为新条目

为此,我创建了第三个数据库,其中包含来自两个表的 URL 组合,大约 4,000 个条目。我需要在这个数据库中找到所有重复的条目并删除它们(它们都没有离开)。

我已经按照这个站点上的几个示例的查询,但是每当我尝试删除这两个条目时,它最终都会删除所有条目,或者给出 sql 错误。


或者:我有两个数据库,每个数据库都包含单独的数据库。我需要检查一个数据库中的每一行,以找到不重复的任何行,然后将它们添加到第三个数据库中。

4

2 回答 2

0

Since you were looking for a SQL solution here is one. Lets assume that your table has a single column for simplicity sake. However this will work for any number of fields of course:

CREATE TABLE `allkindsofvalues` (
  `value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

The following series of queries will accomplish what you are looking for:

CREATE TABLE allkindsofvalues_temp LIKE allkindsofvalues;

INSERT INTO allkindsofvalues_temp SELECT * FROM allkindsofvalues akv1 WHERE (SELECT COUNT(*) FROM allkindsofvalues akv2 WHERE akv1.value = akv2.value) = 1;

DROP TABLE allkindsofvalues;
RENAME TABLE allkindsofvalues_temp to allkindsofvalues;
于 2012-11-03T04:45:14.053 回答
0

OP写道:

我有我自己的 PHP 解决方案,它非常 hacky,但是可以工作。

我使用 PHP 脚本来完成此操作,因为我对 PHP 比对 MySQL 更熟悉。

这会生成一个简单的 url 列表,这些 url 仅存在于目标数据库中,但不能同时存在。如果要解析的条目超过 7,000 个,这可能需要一段时间,并且您需要将结果复制/粘贴到文本文件中或展开脚本以将它们存储回数据库中。

我只是手动操作以节省时间。

注意:使用 MeekroDB

<pre>
<?php
require('meekrodb.2.1.class.php');

DB::$user = 'root';
DB::$password = '';
DB::$dbName = 'testdb';

$all = DB::query('SELECT * FROM old_urls LIMIT 7000');

foreach($all as $row) {
    $test = DB::query('SELECT url FROM new_urls WHERE url=%s',
        $row['url']);

    if (!is_array($test)) {
            echo $row['url'] . "\n";
    }else{
        if (count($test) == 0) {
            echo $row['url'] . "\n";
        }
    }
}
?>
</pre>
于 2015-08-24T14:31:01.637 回答