Написание запроса SQL JOIN

Я пытаюсь написать простой запрос, включающий две таблицы. Таблица «person» имеет уникальные person_id и name, а таблица «friends» имеет person_id и friend_id, которые являются FK для person_id в таблице person.

person:
<PK> int person_id 
varchar[45] name

friends: 
<PK> int person_id
<PK> int friend_id

Я хочу выбрать имена всех друзей человека 1.

Я легко могу это сделать, используя инструкцию IN:

SELECT p.name FROM person p WHERE p.person_id IN (SELECT f.friend_id FROM friends f WHERE f.person_id = 1);

Однако я не умею писать заявления JOIN. Может ли кто-нибудь помочь мне написать эквивалентное соединение?

Ясно, что это надуманный пример, но я пробовал использовать свои реальные данные и концептуально что-то упустил. Спасибо.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
0
16 241
5

Ответы 5

Вам нужно что-то вроде этого:

SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.person_id
WHERE p.person_id = 1

Это объединяет две таблицы вместе с помощью p.person_id = f.person_id

Если у человека нет друзей, вы не получите назад никаких строк - если вы этого не хотите, используйте LEFT JOIN, и вы получите одну строку с NULL friend_id.

Обновлено: если вы хотите снова присоединиться к друзьям к человеку:

SELECT p.name AS person_name, friend.name AS friend_name
FROM person AS p                                         -- Our person
INNER JOIN friends AS f ON p.person_id = f.person_id     -- the join table
INNER JOIN person AS friend on f.friend_id = friend.id   -- Join back on person again
WHERE p.person_id = 1

Возможно, вам понадобится трехстороннее соединение, подобное этому, для вашего приложения, но обычно вам понадобится только двухстороннее соединение, как указано выше, или подобное:

SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.friend_id
WHERE f.person_id = 1

Это даст вам имена всех людей, которые являются друзьями с person_id 1 (но не с именем person_id 1)

SELECT p.name FROM person p 
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
select 
    p.name,
    p2.name as friend_name,
from
    person p 
    inner join friends f on p.person_id = f.person_id
    inner join person p2 on f.friend_id = p2.person_id -- friends
where
    p.person_id = <your criteria>
select p.name
from person p, friends f
where f.friend_id = p.person_id
and f.person_id = 1

Я почти уверен, что Тони Эндрюс понял это правильно, за исключением того, что я думаю, что правильный синтаксис помещает исходную таблицу слева, а объединенную таблицу справа ...

SELECT p.name FROM person p 
INNER JOIN friends f ON p.person_id = f.friend_id
WHERE f.person_id = 1

Это вернет поле [person.name] всех записей, где значение [person.person_id] находится в поле [friends.friend_id], И поля [friends.person_id] равны 1 .... каждый, кто является другом [1], будет существовать в таблице отфильтрованных лиц, когда они присоединятся вместе и ограничены friends.person_id=[1]

Другие вопросы по теме