Помогите многие-ко-многим запрос сделать

vadim_123
Дата: 18.08.2004 12:58:48
Есть таблицы:
phone (id_ph, ph)
1, tel1
2, tel2
3, tel3
addr (id_ad, ad)
1, addr1
2, addr2
3, addr3
phone_addr (id_ph, id_ad)
1, 1
1, 2
1, 3
2, 1
3, 3

То есть на каждый телефон - несколько адресов и на каждый адрес - несколько телефонов.

Запрос: select ... where phone.ph='tel2', в данном случае должен возвращать все значения из таблиц (id_ph=2 <-> id_ad=1 <-> id_ph=1 <-> id_ad=1,2,3).

Как быть? По структуре базы тоже буду очень рад любым предложениям.
CM Hungry
Дата: 18.08.2004 16:20:07
select phone_addr.*, addr.ad, phone.ph from phone_addr
inner join phone on (phone.id_ph=phone_addr.id_ph)
inner join addr on (addr.id_ad=phone_addr.id_ad)
where phone.ph='tel1'

?
vadim_123
Дата: 18.08.2004 17:07:50
К сожалению не совсем то. Телефон связан с другими телефонами через общие адреса.

Не where phone.ph='tel1', а phone.ph='tel2' - так нагляднее.

Выбираем 'tel2', получаем id_ph=2
В таблице phone_addr связь для
id_ph=2 - id_ad=1
Там-же:
Код адреса id_ad=1 так-же связан с телефоном id_ph=1,
который связан с адресами id_ad=1,2,3
И так далее...
То есть в результате этого запроса не хватает адреса id_ad=3.
eddie
Дата: 19.08.2004 14:16:27
а какого уровня может быть эта связь?
а1 связан с т1, тот с а2, тот с т2, тот с а3, тот с т3 и т.д.
vadim_123
Дата: 19.08.2004 18:31:44
Связь эта может быть совершенно неопределённого уровня.

У человека есть 2 телефона -
тел1 и тел2.

По этим телефонам он может звонить с разных адресов
адр1, адр2 и адр3.

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

ЗЫ. Пытался для ещё большей наглядности эту схему изобразить, запутался вконец. В общем, спасибо за внимание. Наверное что-нибудь попроще придумаю.