1

データベース内の各エントリを調べ、単一の値がデータベース内の他の場所で重複しているかどうかを確認し、重複している場合は両方のエントリ (または 2 つ以上の場合はすべて) を削除するクエリが必要です。

問題は、エントリが最大 255 文字の URL であり、行を識別する方法がないことです。Stack Overflow に関するいくつかの既存の回答は、パフォーマンスの制限のために機能しないか、文字列を処理するときに明らかに機能しない uniqueid を使用しています。

長いバージョン:

URL (および URL のみ) を含む 2 つのデータベースがあります。1 つのデータベースには約 3,000 の URL があり、もう 1 つのデータベースには約 1,000 の URL があります。

ただし、1,000 の URL の大部分は 3,000 の URL データベースから取得されました。新しいエントリのみとして、1,000 を 3,000 にマージする必要があります。

このために、両方のテーブルの URL を組み合わせて、約 4,000 エントリの 3 つ目のデータベースを作成しました。このデータベース内のすべての重複エントリを見つけて削除する必要があります (両方とも、どちらも残さずに)。

このサイトのいくつかの例のクエリに従いましたが、両方のエントリを削除しようとすると、すべてのエントリが削除されるか、SQL エラーが発生します。


の方法: 2 つのデータベースがあり、それぞれに別のデータベースが含まれています。あるデータベースの各行を別のデータベースと照合して、重複していない行を見つけてから、それらを 3 番目のデータベースに追加する必要があります。

4

2 に答える 2

0

OP は次のように書いています。

私はかなりハックですが、動作する独自のPHPソリューションを持っています。

私は MySQL よりも PHP に精通しているので、これを達成するために PHP スクリプトを使用しました。

これにより、ターゲット データベースにのみ存在し、両方には存在しない 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 に答える
0

SQL ソリューションを探していたので、ここに 1 つを示します。簡単にするために、テーブルに単一の列があると仮定しましょう。ただし、これはもちろん、任意の数のフィールドで機能します。

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

次の一連のクエリは、探しているものを実現します。

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 に答える