MySQL: как получить значение из таблицы, в которой есть повторяющиеся записи этого значения?

У меня есть SourceTable вроде:

ColumnA   ColumnB   ColumnC   ...
1         a         apple
2         b         ball
3         c         car
4         a         apple
5         p         pizza

ColumnB и ColumnC имеют повторяющиеся значения.

Мой код:

INSERT INTO TargetTable
SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM SourceTable
WHERE ColumnB = 'a';

Мне просто нужно ввести одно значение в TargetTable. Результат должен выглядеть примерно так:

Bob   a   apple   currentTime   ...

Проблема заключается в том, что каждая повторяющаяся запись вводится в TargetTable.

Обновлено: кстати, a в WHERE ColumnB = 'a'; динамический. Он меняется в зависимости от взаимодействия с пользователем.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Теоретический ответ, без каких-либо знаний о сценариях использования, которые привели к проектированию БД.

Этого сценария часто избегают, разбивая столбцы B и C в родительскую таблицу с уникальным ключом в столбцах B и C. Затем используйте столбец внешнего ключа в SourceTable для ссылки на родительскую таблицу.

Что касается вашего оператора INSERT, столбцы B и C будут ссылками на родительскую таблицу, где гарантировано, что у вас будет уникальное значение столбцов B и C, что позволит избежать ошибки повторяющейся записи.

См. https://en.wikipedia.org/wiki/Database_normalization относительно уменьшения избыточности данных, например, повторяющиеся значения столбцов B и C (a, apple) в SourceTable.

Но если редизайн БД по тем или иным причинам невозможен ...

Вы можете использовать SELECT DISTINCT

INSERT INTO TargetTable
SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM (SELECT DISTINCT ColumnB, 
ColumnC from SourceTable) derived_table
WHERE ColumnB = 'a';

Извините за интересный вопрос, но как выглядит производная_таблица?

Carlo Santana 31.05.2018 00:48

Не нужно извиняться за искренние вопросы. производная_таблица - это псевдоним для таблицы, полученной в результате подзапроса (SELECT DISTINCT ColumnB, ColumnC from SourceTable).

Otomatonium 31.05.2018 01:02

Мне нужно создать производную_таблицу? Какой еще код связан с производной_таблицей?

Carlo Santana 31.05.2018 01:12

Вам не нужно создавать производную_таблицу отдельно от оператора INSERT, и вы никогда не «увидите» ее во время выполнения оператора. Если вы хотите увидеть, как выглядит таблица, в целях отладки, попробуйте запустить отдельный запрос select ... Для справки по производным таблицам MySQL: dev.mysql.com/doc/refman/8.0/en/dehibited-tables.html

Otomatonium 31.05.2018 01:16

У меня была другая проблема внутри моего запроса, мешающая вашему успешному выполнению .. Он работает! Я оценил вашу помощь!

Carlo Santana 31.05.2018 01:24

Другие вопросы по теме