mysql group_concat一个表到另一个表

时间:2011-01-20 17:36:20

标签: mysql sql

我想有一个查询来解决我在本机sql中的问题。

我有一个名为“synonym”的表格,其中包含单词和单词“synonymsviations”。

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

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

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但我无法实现这一目标。

希望这很清楚。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您提出的架构非常糟糕。

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

表格

id     word
1      abandon
234    forsaken

表同义词

wid    sid
1      234
1      90

答案 1 :(得分: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;