2011-01-20 7 views
0

ネイティブSQLの問題を解決するためのクエリが必要です。mysql group_concatテーブル間で

私は単語と同義語を保持する "同義語"という名前のテーブルを持っています。

id, word, synonym 
1, abandon, forsaken 
2, abandon, desolate 
... 

あなたが見ることができるように、この表では単語が何度も繰り返されているため、テーブルが不必要に大きくなります。

id, word, synonyms 
1, abandon, 234|90 
... 

注:ここでは「234」と「90」は、新しく作成された言葉のテーブルに見捨てられたと荒涼としたのidのある私のような重複した単語を持たないテーブルの名前「言葉」を持っていると思います。

私はすでに同義語テーブルの単語フィールドから一意の単語で新しい "単語"テーブルを作成しました。私が必要とするのは、各単語の同義語の同義語表を見てから、その単語の表からIDを見つけ出し、 "同義語"フィールドを垂直線分の分離IDで更新するSQLクエリです。同義語テーブルを削除します。

だけのよう:

UPDATE words SET synonyms= (vertical line seperated id's (id's from words table) of the words at the synonyms at synonym table) 

私はGROUP_CONCATを使用する必要があります知っているが、私はこれを達成できませんでした。

これで十分です。助けてくれてありがとう!

+0

ジャストノート - 2つの言葉はあなたが提案している構造と同義語であるならば、識別することがやや難しいかもしれません。 –

+0

私は困難を考えましたが、この構造では、 "id = '1'やid = '2' ...のようなクエリ内でidとimplodeを取得するためにexplodeを使用して、それぞれの同義語を取得します。それは私にとっては良いことです。 –

答えて

1

あなたはアップデートの使用を避けることができ、それは以下のクエリを使用してください:

TRUNCATE TABLE words; 

INSERT INTO words 
SELECT (@rowNum := @rowNum+1), 
       a.word, 
       SUBSTRING(REPLACE(a.syns, a.id + '|', ''), 2) syns 
FROM (
      SELECT a.*,group_concat(id SEPARATOR '|') syns 
      FROM synonyms a 
      GROUP BY word 
     ) a, 
     (SELECT @rowNum := 0) b 

テストスクリプト:

CREATE TABLE `ts_synonyms` (
    `id` INT(11) NULL DEFAULT NULL, 
    `word` VARCHAR(20) NULL DEFAULT NULL, 
    `synonym` VARCHAR(2000) NULL DEFAULT NULL 
); 

CREATE TABLE `ts_words` (
    `id` INT(11) NULL DEFAULT NULL, 
    `word` VARCHAR(20) NULL DEFAULT NULL, 
    `synonym` VARCHAR(2000) NULL DEFAULT NULL 
); 

INSERT INTO ts_synonyms 
VALUES ('1','abandon','forsaken'), 
('2','abandon','desolate'), 
('3','test','tester'), 
('4','test','tester4'), 
('5','ChadName','Chad'), 
('6','Charles','Chuck'), 
('8','abandon','something'); 


INSERT INTO ts_words 
SELECT (@rowNum := @rowNum+1), 
       a.word, 
       SUBSTRING(REPLACE(a.syns, a.id + '|', ''), 2) syns 
    FROM (
        SELECT a.*, 
            GROUP_CONCAT(id SEPARATOR '|') syns 
         FROM ts_synonyms a 
         GROUP BY word 
      ) a, 
       (SELECT @rowNum := 0) b; 
SELECT * FROM ts_synonyms;    
SELECT * FROM ts_words;    
+0

申し訳ありませんが、これは私が理解するのは少し難しいです。可能であれば、フィールドとテーブルの名前を質問に書いたものに置き換えることができますか?ありがとう。 –

+0

クエリが更新されました。あなたはテーブルのバックアップを取ることを確認してください – Chandu

+0

ありがとう! –

2

あなたの提案スキーマは、プレーン恐ろしいです。

なぜmany-to-many関係を使用しますか?

表の言葉

id  word 
1  abandon 
234 forsaken 

表の同義語

wid sid 
1  234 
1  90 
+0

ええ、私はスキーマが恐ろしいことを知っています。しかし、私は本当にどのように私はこれを1つのテーブルに並べ替えることができるか知りたいです。たとえ私が2つのテーブルソリューションを使うことに決めたとしても、私はこのようなことをする方法を学びたいと思っています。あなたの意見に感謝します。 –

+1

多対多が唯一の方法です。データを2回保存する必要はなく、両方の言葉の間に関係があります。あなたが望む任意の方法であなたのデータを見つける非常に速い方法。 – patrick