我想有一个查询来解决我在本机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但我无法实现这一目标。
希望这很清楚。谢谢你的帮助!
答案 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;