1

MySQL テーブルと、値がタブで区切られた大きなテキスト ファイルがあります。このファイルには重複が含まれている可能性があります。これは例です:

foo \t 5
bar \t 42
etc \t 22
bar \t 50
oth \t 12

また、各ファイルには、他のファイルに応じて重複が含まれる場合があります。例えば:

abc \t 33
foo \t 10

これらのファイルをテーブルにロードして、重複をマージする (数値を合計する) 必要があります。両方のファイルをインポートすると、データベースは次のようになります。

| text | num |
+------+-----+
| foo  |  15 |
| bar  |  92 |
| etc  |  22 |
| oth  |  12 |
| abc  |  33 |

これらは私がすでに知っているコマンドです:

  • テキスト ファイルをロードします。

    LOAD DATA INFILE "file.txt" INTO TABLE `table` FIELDS TERMINATED BY '\t';

  • 重複のある行を選択:

    SELECT * FROM `table` GROUP BY `text` HAVING COUNT(*) > 1;

4

1 に答える 1

0

だから、私はこれを達成する方法を見つけました。

メイン テーブルを作成します。

CREATE TABLE IF NOT EXISTS `test`
(`text` VARCHAR(255) NOT NULL, `num` INT(11) NOT NULL);

ファイルをテーブルにロードします。

LOAD DATA LOCAL INFILE 'local/path/to/file.txt'
INTO TABLE `test` FIELDS TERMINATED BY '\t';

合計数が重複している一時テーブルを作成します。

CREATE TEMPORARY TABLE `test_tmp`
SELECT `text`,SUM(`num`) FROM `test`
GROUP BY `text` HAVING COUNT(*) > 1;

メイン テーブルから重複を削除します。

DELETE FROM `test` WHERE `text`
IN (SELECT `text` FROM `test_tmp`);

データをメイン テーブルにコピーします。

INSERT INTO `test` SELECT * FROM `test_tmp`;

一時テーブルを削除します。

DROP TEMPORARY TABLE `test_tmp`;

これを行うより良い方法はありますか?

于 2013-04-07T02:17:24.507 に答える