mysql group_concat одна таблица в другую

0

Мне бы хотелось иметь запрос, который решит мою проблему в 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, но я не мог этого добиться.

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

  • 0
    Просто примечание - может быть несколько трудно определить, являются ли два слова синонимами предлагаемой структуры.
  • 0
    Я думал о трудностях, но с этой структурой я буду использовать Explode, чтобы получить идентификаторы и внедрить их в запросе типа «или id = '1' или id = '2' ...", чтобы получить каждый синоним. это лучше для меня.
Теги:

2 ответа

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

Тест 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;             
  • 0
    извините, это немного сложно для меня, чтобы понять. поэтому, если возможно, вы можете заменить имена полей и таблиц теми, которые я написал в вопросе? Благодарю.
  • 0
    Обновил запрос. Попробуйте noe .. Убедитесь, что вы делаете резервную копию таблиц
Показать ещё 4 комментария
2

Ваша предлагаемая схема проста.

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

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

id     word
1      abandon
234    forsaken

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

wid    sid
1      234
1      90
  • 0
    да, я знаю, что схема ужасна. но я действительно хочу знать, как я могу разобраться в одной таблице. даже если я решу пойти с решением за двумя столами, я бы даже хотел научиться делать что-то подобное. Большое спасибо за ваше мнение.
  • 1
    «многие ко многим» - это ЕДИНСТВЕННЫЙ путь. Вам не нужно будет хранить данные дважды, и вы будете иметь связь между словами в обоих направлениях. Очень быстрый способ найти ваши данные любым удобным для вас способом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню