Позвольте мне представить аналогичную ситуацию. У вас есть база данных людей, и вы обеспокоены тем, что у каждого человека может быть несколько телефонных номеров.
CREATE TABLE Persons (
person_id INT UNSIGNED AUTO_INCREMENT,
...
PRIMARY KEY(person_id) );
CREATE TABLE PhoneNumbers (
person_id INT UNSIGNED,
phone VARCHAR(20) CHARACTER SET ascii,
type ENUM('unknown', 'cell', 'home', 'work'),
PRIMARY KEY(person_id, phone) );
Таблица PhoneNumbers
имеет отношение «многие к 1» между телефонными номерами и людьми. (Неважно, если два человека используют один и тот же номер.)
SELECT ...
GROUP CONCAT(pn.phone) AS phone_numbers,
...
FROM Persons AS p
LEFT JOIN PhoneNumbers AS pn USING(person_id)
...;
доставит список телефонных номеров (например: 123-456-7890,333-444-5555
) для каждого выбранного человека. Из-за LEFT
он доставит NULL
, если у человека нет связанных телефонов.
Чтобы ответить на ваш другой вопрос: не практично разбивать коммалист на компоненты.