2011-01-20 56 views
0

我想有一个查询,将解决我的问题,在本机SQL。mysql group_concat一个表到另一个

我有一个名为“synonym”的表,它包含单词和单词“synonym”。

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

正如你所看到的,在这张表中重复出现的词很多次,这使得表不必要的大。我想有一个表名为“单词”,它没有重复的单词,如:

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

注:“234”和“90”在这里是的id的离弃和荒凉的新创建的词表。

所以我已经创建了一个新的“单词”表中的单词字段在同义词表中的独特单词。我需要的是一个SQL查询,它将查看每个单词的同义词表的同义词表,然后从单词表中查找它们的ID并使用垂直行分隔的ID更新“同义词”字段。那么我将删除同义词表。

只是想:

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个字是与你提出的结构同义词。 – 2011-01-20 17:46:27

+0

我想到了困难,但有了这个结构,我将使用爆炸得到的ID和内爆查询像“或ID ='1'或ID ='2'...”查询每个同义词。这对我更好。 – 2011-01-20 18:23:43

回答

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

对不起,这有点难以理解。所以如果可能的话,你可以用我在问题中写的字段替换字段和表名称吗?谢谢。 – 2011-01-20 18:27:12

2

你提出的方案是平原可怕。

为什么不使用many-to-many关系?

表字

id  word 
1  abandon 
234 forsaken 

表同义词

wid sid 
1  234 
1  90 
相关问题