2013-11-28 2 views
1
  • Прежде всего: я знаю, что его очень плохой стиль для работы с несколькими записями в одном поле, но я сам не создал базу данных, и теперь мне нужно работать с ней. Он имеет около 20000 записей, и я действительно не хочу менять его на данный момент.
  • Таблица Я говорю о имеет столбец с некоторыми идентификаторов, например .: ,282,3358,123,
  • Эти идентификаторы имеют соответствие с первичными ключами некоторой другой таблицы B. B имеет другое название столбца.
  • Я хочу, чтобы получить эти имена в моей таблице заменив эти идентификаторы
  • Пример:

Таблица BНесколько значений для каждого поля в базе данных MySQL

| ID |  name   |  
+----+-------------------+ 
|282 |  name_1  | 
+----+-------------------+ 
|3358|  name_2  | 
+----+-------------------+ 
|123 |  name_3  | 

Исходная ситуация СТОЛ

... |   ID    | ...  
-----+------------------------+----- 
... | ,282,3358,123,  | ... 

Желаемого результата для ТАБЛИЦЫ А

... |   ID    | ...  
-----+------------------------+----- 
... | ,name_1,name_2,name_3, | ... 
+0

Является ли таблица A новой таблицей? Если да, почему бы не изменить структуру на то, что следует за теорией реляционных баз данных - это не будет принципиально изменять характер проблемы, но удалит другие, с которыми вы столкнетесь в будущем, если вы не ... –

+0

упомяните о том, что если вы замените цифры строками, вы столкнетесь с именами типа «Смит, Джонс» и получите путаницу запятыми. – CompuChip

+0

@RobBaillie A - это существующая таблица @BartFriederichs Я проверю 'GROUP_CONCAT' –

ответ

0

Я нашел способ, как справиться с моей проблемой. Однако на самом деле не рекомендуется использовать несколько записей в поле. Но если ваш в такой ситуации, как мне, где вы должны работать с таким unrelational интриговал базы данных без разрешения изменить схему, здесь мы:

SELECT [...] , 
(SELECT GROUP_CONCAT(table_B.name SEPARATOR ',') FROM table_B 
WHERE FIND_IN_SET (B.ID , SUBSTRING (table_A.ID , 2 , length(table_A.ID) -2)) >0) , 
[...] 
FROM table_A 

Некоторые пояснения:

  • SUBSTRING необходимо для удаления «,» в начале множественного ввода поля. Например: SUBSTRING (",282,3358,123," , 2 , length(",282,3358,123,") -2) результаты в «282,3358,123»
  • Метод FIND_IN_SET ищет значение в списке строк, разделенных запятыми, и возвращает индекс значения. Если значение не найдено, оно возвращает 0. Вот почему я сравниваю целую строку с 0.
  • Метод GROUP_CONCAT объединяет совпадающие имена. В результате он обеспечивает разделенный запятыми список строк ==>name_1,name_2,name_3

Некоторые аннотаций:

  • Используя этот запрос очень неэффективно.Этот запрос должен иметь дело с по крайней мере #ROWS_IN_TABLE_A * #ROWS_IN_TABLE_B строками таблицы
  • Что касается проблем с производительностью, следует предварительно скопировать таблицу и сохранить ее в базе данных (это то, что я сделал).
0

С помощью всего лишь одной инструкции SQL может быть очень трудно, I'would сделать функцию в MySQL, что:

1) Создание курсора со стандартной таблицей -) Искать каждое значение из таблицы B 3) Заполните поле [новое] со значениями от B

20000 строк не слишком много.

Смежные вопросы