В языке SQL и в MySQL в частности, нет прямого способа привязать несколько id к одному имени в одной таблице. Однако, существует несколько путей решения данной задачи, они зависят от контекста и требований.
1. Добавление дополнительной таблицы:
- Создайте отдельную таблицу с двумя столбцами: имя и id;
- Каждая запись будет содержать имя и соответствующий ему id;
- Для каждого имени можно задать несколько id.
Пример кода для создания и заполнения такой таблицы:
CREATE TABLE names ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL ); CREATE TABLE names_ids ( name_id INT PRIMARY KEY, id INT, FOREIGN KEY (name_id) REFERENCES names(id) ); INSERT INTO names (name) VALUES ('Имя1'), ('Имя2'), ('Имя3'); INSERT INTO names_ids (name_id, id) VALUES (1, 101), (1, 102), (2, 201), (3, 301), (3, 302);
Теперь для каждого имени можно хранить несколько id:
SELECT name, id FROM names JOIN names_ids ON names.id = names_ids.name_id;
2. Использование JSON-поля:
- В MySQL 5.7 и выше можно использовать JSON поле для хранения нескольких значений id в одном столбце;
- Запишите все id в формате JSON и сохраните их в одном поле.
Пример кода для создания таблицы с JSON-полем:
CREATE TABLE names ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, ids JSON ); INSERT INTO names (name, ids) VALUES ('Имя1', '[101, 102]'), ('Имя2', '[201]'), ('Имя3', '[301, 302]');
Теперь можно получить список id для каждого имени:
SELECT name, JSON_EXTRACT(ids, '$[*]') AS ids FROM names;
3. Использование разделительных строк:
- В этом случае вы можете сохранить несколько id в одной строке, разделяя их каким-либо символом;
- При запросе вы сможете разделить строку и получить отдельные значения id.
Пример кода для создания таблицы с разделительными строками:
CREATE TABLE names ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, ids VARCHAR(255) ); INSERT INTO names (name, ids) VALUES ('Имя1', '101, 102'), ('Имя2', '201'), ('Имя3', '301, 302');
Вы можете разделить строки, используя функцию SUBSTRING_INDEX
:
SELECT name, SUBSTRING_INDEX(ids, ',', 1) AS id FROM names;
Обратите внимание, что каждый из этих подходов имеет свои преимущества и недостатки, и выбор решения должен зависеть от конкретного случая использования.