「URL」というフィールドに URL を含む「LINK_INFO」という名前のテーブルがあります。問題は、一意のフィールド要件を回避するために末尾の / を使用したものを除いて、多くの重複 URL が存在することです。
例:
http://www.yahoo.com および http://www.yahoo.com/
これらのほぼ重複するケースを選択して、そのうちの 1 つを削除できるようにするために使用できるステートメントは何ですか? あなたが助けてくれるなら、どうもありがとう。
「URL」というフィールドに URL を含む「LINK_INFO」という名前のテーブルがあります。問題は、一意のフィールド要件を回避するために末尾の / を使用したものを除いて、多くの重複 URL が存在することです。
例:
http://www.yahoo.com および http://www.yahoo.com/
これらのほぼ重複するケースを選択して、そのうちの 1 つを削除できるようにするために使用できるステートメントは何ですか? あなたが助けてくれるなら、どうもありがとう。
TRIM
すべての一意の値を見つけるために使用できます。
SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info
重複をすぐに削除するには、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
ネット上で見つかった任意の 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。
たぶん、このようなものですか?
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 |
この時点で、これを一時テーブルに挿入し、親を削除して再入力できます。