Задать вопрос

Как правильно сформировать sql запрос при связи n:n?

Есть 3 таблицы :
users , wallets , wallet_address .
Юзер может иметь значение некоторых адресов к кошелькам , а может и не иметь
Связь users к wallets многие ко многим .

wallet_address кроме полей user_id и wallet_id есть еще value( именно сам адрес кошелька)
Проблема в том , что не могу понять как сформировать sql запрос , чтобы выбрать все кошельки системы и при условии , что у юзера есть адрес к кошельку, вывести этот адрес . Например вывод всех кошельком приложения :
foreach($wallets as $wallet) {
    echo $wallet['name'];
    echo $wallet['wallet_address'] //конкретный адрес , который добавил юзер(если нет , то null)
}

Такое чувство , что такую проблему уже много раз решали , не могу понять как . Подскажите , пожалуйста
  • Вопрос задан
  • 204 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
А в чем проблема?
users - это одно множество;
wallets - это другое множество;
wallet_address - пересечение множеств (таблица с хордами [user_id, wallet_id]).
Нужно просто склеить все таблицы по соответствующим ключам и вывести те записи из users, которые пересекаются с записями wallets с непустым value.
select u.user_id, w.wallet_id, wa.value as address
  from users u
   join wallet_address wa on wa.user_id = u.user_id
   join wallets w on w.wallet_id = wa.wallet_id
where wa.value is not null

PS: А вы уверены, что адрес кошелька должен определяться по комбинации [user_id, wallet_id], это разве не самостоятельное свойство кошелька, то есть конкретной записи wallets?
Если это так, то value будет относиться к wallets, а таблица wallet_address не будет иметь отношение к адресу, она просто будет хранить два внешних ключа user_id и wallet_id, чтобы выполнять исключительно функцию хранения хорд пересечений n:n.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы