mysql group_concat одна таблица в другую - PullRequest
0 голосов
/ 20 января 2011

Я хотел бы получить запрос, который решит мою проблему в нативном sql.

У меня есть таблица с именем "синоним", которая содержит слова и синонимы слов.

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

Как видите, слова повторяются в этой таблице много раз, и это делает таблицу излишне большой.я хотел бы иметь таблицу с именем "words", в которой нет повторяющихся слов, таких как:

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

note: "234" и "90" - это идентификаторы оставленных и опустошенных во вновь созданных словахtable.

, поэтому я уже создал новую таблицу "слов" с уникальными словами из поля слов в таблице синонимов.что мне нужно, это 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, но не смог этого достичь.

надеюсь, что это такдостаточно ясно.спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Предложенная схема ужасна.

Почему бы не использовать many-to-many отношение?

Табличные слова

id     word
1      abandon
234    forsaken

Синонимы таблицы

wid    sid
1      234
1      90
1 голос
/ 20 января 2011

Вы можете не использовать обновление и делать это, используя запросы ниже:

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;             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...