MySQL объединяет два столбца и добавляет в новый столбец

#mysql #sql

#mysql #sql

Вопрос:

У меня есть следующая структура с таблицей MySQL:

  ---------------- ---------------- ---------- 
|    zipcode     |      city      |   state  |
 ---------------- ---------------- ---------- 
|     10954      |     Nanuet     |    NY    |
 ---------------- ---------------- ---------- 
  

Я хочу объединить вышеупомянутые 3 столбца в один столбец следующим образом:

  --------------------- 
|      combined       |
 --------------------- 
| 10954 - Nanuet, NY  |
 --------------------- 
  

И я хочу добавить этот «объединенный» столбец в конец таблицы, не уничтожая исходные 3 поля.

Ответ №1:

Создайте столбец:

 ALTER TABLE yourtable ADD COLUMN combined VARCHAR(50);
  

Обновите текущие значения:

 UPDATE yourtable SET combined = CONCAT(zipcode, ' - ', city, ', ', state);
  

Автоматически обновлять все будущие значения:

 CREATE TRIGGER insert_trigger
BEFORE INSERT ON yourtable
FOR EACH ROW
SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);

CREATE TRIGGER update_trigger
BEFORE UPDATE ON yourtable
FOR EACH ROW
SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);
  

Комментарии:

1. Как мне установить два поля при обновлении, я попытался добавить другой оператор set new.rowname, но просто получаю ошибку.

2. Здесь я использую память, но я почти уверен, что вы можете просто разделить значения для установки запятыми, например: set new.foo = 1, new.bar = 2

3. Мне было интересно, что, если одно поле должно поступать из другой таблицы, т. Е. город, поступающий из table2??

4. Вы можете запросить другую таблицу в подзапросе из триггера, что-то вроде set newLearn more….combined = (select city from foo where ...) . Однако вам следует проявлять большую осторожность при построении зависимостей между таблицами в триггерах. Это может вызвать некоторые действительно неприятные проблемы с блокировкой, поскольку любое обновление одной таблицы может потребовать блокировки нескольких других таблиц. В большинстве случаев вы можете найти лучший способ, возможно, либо лучше нормализовав структуру данных, либо перенеся часть логики в код вашего приложения, а не перенося ее в базу данных.

5. В большинстве случаев кажется более оптимальным concat обрабатывать данные на лету, а не создавать новый экземпляр столбца. Смотрите ответ MikeTheReader.

Ответ №2:

Вы уверены, что хотите это сделать? По сути, вы дублируете данные, которые находятся в трех исходных столбцах. С этого момента вам нужно будет убедиться, что данные в объединенном поле соответствуют данным в первых трех столбцах. Это больше накладных расходов для вашего приложения, и другим процессам, которые обновляют систему, потребуется понять взаимосвязь.

Если вам нужны данные, почему бы не выбрать в, когда вам это нужно? SQL для выбора того, что будет в этом поле, будет:

 SELECT CONCAT(zipcode, ' - ', city, ', ', state) FROM Table;
  

Таким образом, если данные в полях изменяются, вам не нужно обновлять ваше объединенное поле.

Комментарии:

1. Я использую функцию автозаполнения и хочу иметь возможность выполнять автозаполнение как по почтовому индексу, так и по городу, это кажется единственным простым способом. По крайней мере, с моим уровнем знаний.

2. Выполните автозаполнение следующим образом: ВЫБЕРИТЕ * из таблицы, где почтовый индекс ТИПА ‘%q% Или город ТИПА’%q% или штат ТИПА ‘%q%

3. По-моему, это самый чистый вариант. Дублирование данных, а затем необходимость проверять, синхронизированы ли они, и внедрение дополнительной логики для решения проблем с несинхронизацией в коде более высокого уровня кажется намного более грязным, чем простое объединение SELECT или, что еще лучше, использование приложения для объединения. Не могу не согласиться с этим ответом, хотя ответ @squawknull представил классную концепцию, где это уместно.

Ответ №3:

Добавьте новый столбец в свою таблицу и выполните запрос:

 UPDATE tbl SET combined = CONCAT(zipcode, ' - ', city, ', ', state)
  

Комментарии:

1. Мне нравится этот вариант, потому что он обеспечивает производительность по сравнению с хранилищем. Для увеличения производительности хранилища вы могли бы добавить concat к самому запросу select. Код триггера см. в сообщении squaknull.

Ответ №4:

ВЫБЕРИТЕ CONCAT (почтовый индекс, ‘ — ‘, город, ‘, ‘, штат) КАК ОБЪЕДИНЕННЫЙ ИЗ ТАБЛИЦЫ