0

次のようなエントリを含む列があります: abc.yahoo.com efg.yshoo.com hij.yahoo.com

すべての重複を削除し、他は必要ないので 1 つだけ残す必要があります。このようなコマンドは、2 番目の部分 (例: yahoo.com) を知っていれば簡単に実行できますが、問題はその部分 (yahoo.com) が修正されていないことです。次のようなエントリがあるかもしれません: abc.msn.com efg.msn.com hij.msn.com

そして、これらすべてのケースを一度に処理したいと考えています。これは可能ですか?

4

2 に答える 2

0

.これは、最初の文字の前に文字を取り出し、列でグループ化したいだけだと仮定しています:

DELETE a FROM tbl a
LEFT JOIN
(
    SELECT   MIN(id) AS id
    FROM     tbl
    GROUP BY SUBSTRING(column, LOCATE('.', column))
) b ON a.id = b.id
WHERE b.id IS NULL

は主キーid列名で、columnグループ化する値を含む列です。

xxx.co.ukこれは、最後に 2 つの部分がある場合のようなドメインも考慮します。

現在のデータのバックアップがあることを確認するか、トランザクション内でこの操作を実行してROLLBACK;ください (ニーズに合わない場合は可能です)。

EDIT. :重複を削除した後、最初の文字の前の文字を に置き換えたい場合は、次の*ように単純に使用できます。

UPDATE tbl
SET column = CONCAT('*', SUBSTRING(column, LOCATE('.', column)))
于 2012-07-29T20:02:21.023 に答える
0

使用できる重複を削除するには

DELETE FROM your_table t1
LEFT JOIN
(
    SELECT   MIN(id) AS id
    FROM     your_table 
    GROUP BY SUBSTRING_INDEX(REVERSE(col), '.', 2)
) t2 ON t2.id = t1.id
WHERE b.id IS NULL

そのためにUNIQUE制約を作成する必要がある場合は、次のことができます

1.ドメイン値を保持する別のフィールドを追加します

ALTER TABLE your_table ADD COLUMN `domain` VARCHAR(100) NOT NULL DEFAULT '';

2.正しい値で更新します

UPDATE your_table set domain = REVERSE(SUBSTRING_INDEX(REVERSE(col), '.', 2));

3.ユニーク制約を追加する

ALTER IGNORE TABLE your_table ADD UNIQUE domain (domain);

4.挿入前および更新前のトリガーを追加して、ドメイン列を設定します

DELIMITER $$

CREATE TRIGGER `your_trigger` BEFORE INSERT ON `your_table ` FOR EACH ROW 
BEGIN
    set new.domain = REVERSE(SUBSTRING_INDEX(REVERSE(new.col1), '.', 2));
END$$


CREATE TRIGGER `your_trigger` BEFORE UPDATE ON `your_table ` FOR EACH ROW 
BEGIN
    set new.domain = REVERSE(SUBSTRING_INDEX(REVERSE(new.col1), '.', 2));
END$$

DELIMITER ;

注: これはドメインが「.」で区切られた最後の 2 語であることを前提としています。ebay.co.uk などのドメインでは機能しません。そのためには、おそらく、特定のホストのドメインを返すストアド関数を作成し、それを の代わりに使用する必要がありますREVERSE(SUBSTRING_INDEX...

于 2012-07-29T20:04:46.077 に答える