0

「URL」というフィールドに URL を含む「LINK_INFO」という名前のテーブルがあります。問題は、一意のフィールド要件を回避するために末尾の / を使用したものを除いて、多くの重複 URL が存在することです。

例:

http://www.yahoo.com および http://www.yahoo.com/

これらのほぼ重複するケースを選択して、そのうちの 1 つを削除できるようにするために使用できるステートメントは何ですか? あなたが助けてくれるなら、どうもありがとう。

4

2 に答える 2

1

TRIMすべての一意の値を見つけるために使用できます。

SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info

でテストするSQLfiddle

重複をすぐに削除するには、delete join を実行します。

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
      TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id

テスト用の別の SQLfiddle

ネット上で見つかった任意の SQL を実行する前に、常にテーブルをバックアップしてください:)

EDIT:データベースマシンが限られている場合は、インデックスを使用してそれを行い、必要以上にメモリにロードしないようにすることができます。

-- remove all trailing slashes
UPDATE link_info 
SET url=TRIM(TRAILING '/' FROM url);

-- create an index on the resulting strings (if there isn't already one)    
CREATE INDEX url_index ON link_info(url);

-- delete all duplicates
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id;

-- drop the index if not needed anymore
DROP INDEX url_index ON link_info;

さらに別のSQLfiddle

于 2013-01-27T20:34:52.053 に答える
0

たぶん、このようなものですか?

CREATE TABLE link_info (
  url varchar(255));

INSERT INTO link_info VALUES
('http://www.yahoo.com/'),
('http://www.yahoo.com');

SELECT DISTINCT
  CASE
    WHEN SUBSTRING(url, LENGTH(url)) = '/' 
      THEN LEFT(url, LENGTH(url) -1)
    ELSE url
  END AS `url`
FROM link_info

結果

| | URL |
------------------------
| | http://www.yahoo.com |

デモを見る

この時点で、これを一時テーブルに挿入し、親を削除して再入力できます。

于 2013-01-27T20:27:11.757 に答える