MySQL 2 левое соединение из той же таблицы - PullRequest
1 голос
/ 23 октября 2011

Я храню номера телефонов и факсов своих клиентов в одной таблице базы данных. Что не ненормально. Не у всех моих клиентов есть номера телефонов, в то время как у других нет номеров факсов.

Мне нужно просматривать телефон и факс, даже если они пусты. В таблице tbl_customers у меня есть 2 конкретных столбца, посвященных телефону записи по умолчанию и факсу по умолчанию. Они просто хранят идентификатор записи из tbl_phonenumbers.

Вот для телефона:

SELECT c.customername, p.phonenumber
FROM `tbl_customers` c
LEFT JOIN `tbl_phonenumbers` p ON c.customerid = p.customerid
WHERE c.defaultphone = 22

Теперь мне нужно добавить идентификатор номера факса по умолчанию, который следует той же идее, что и телефон по умолчанию.

Я не совсем уверен, как это сделать. Конечно, я мог бы создать совершенно новую таблицу базы данных под названием «tbl_faxnumbers» и LEFT JOIN к ней. Но я бы лучше оставил одну таблицу для номеров телефонов и факсов.

Это возможно с LEFT JOIN?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Вы можете присоединиться к одной и той же таблице несколько раз, при условии, что каждое объединение имеет уникальный псевдоним, чтобы сервер БД мог выяснить, КАКОЕ из тех дополнительных версий таблицы, о которых вы говорите:

SELECT ...
FROM maintable
JOIN othertable AS copy1 ON copy1.somefield = ...
JOIN othertable AS copy2 ON copy2.somefield = ...

Для вашего случая я бы добавил поле идентификатора типа в таблицу телефонных номеров, чтобы вы могли указать, какой номер телефона, а какой номер факса. Тогда вы сделаете ваши объединения как:

SELECT ..., phones.phonenumber, faxes.phonenumber
...
JOIN tbl_phonenumbers AS phones ON (... = phones.id) AND (phones.type = 'phone')
JOIN tbl_phonenumbers AS faxes ON (... = faxes.id) AND (faxes.type = 'fax');
0 голосов
/ 23 октября 2011

Почему бы просто не добавить поле номера факса в tbl_phonemumbers?

...