Мне бы хотелось иметь запрос, который решит мою проблему в native sql.
У меня есть таблица с именем "синоним", в которой содержатся слова и слова "синонимы".
id, word, synonym
1, abandon, forsaken
2, abandon, desolate
...
Как вы можете видеть, слова повторяются в этой таблице много раз, и это делает таблицу излишне большой. я хотел бы иметь таблицу с именем "слова", которая не имеет повторяющихся слов типа:
id, word, synonyms
1, abandon, 234|90
...
note: "234" и "90" здесь являются идентификатором оставленного и опустошенного во вновь созданной таблице слов.
поэтому я уже создал новую таблицу слов с уникальными словами из поля слова в таблице синонимов. мне нужен запрос sql, который будет рассматривать таблицу синонимов для каждого синонимов слова, затем найдет их идентификатор из таблицы слов и обновит поле "синонимы" с помощью вертикальных разделителей. то я просто удалю таблицу синонимов.
как:
UPDATE words SET synonyms= ( vertical line seperated id (id from words table) of the words at the synonyms at synonym table )
Я знаю, что я должен использовать group_concat, но я не мог этого добиться.
надеюсь, что это достаточно ясно. спасибо за помощь!
Вы можете избежать использования обновления и выполнить его с помощью запросов ниже:
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
Тест Script:
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;
Ваша предлагаемая схема проста.
Почему бы не использовать отношение many-to-many
?
Табличные слова
id word
1 abandon
234 forsaken
Синонимы таблицы
wid sid
1 234
1 90