4

2 つのテーブルを含む単純なクエリを作成しようとしています。「person」テーブルには、一意person_idの と がnameあり、「friends」テーブルには、 person テーブルのの FK である と がありperson_idます。friend_idperson_id

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

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

person1の友達全員の名前を選びたいです。

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声明を書くのが得意ではありません。誰かが同等の結合を書くのを手伝ってくれますか?

明らかにこれは不自然な例ですが、実際のデータで試してみたところ、概念的に何かが欠けています。ありがとう。

4

5 に答える 5

7

次のようなものが必要です。

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

これにより、2 つのテーブルが結合されます。p.person_id = f.person_id

友達がいない場合、行は返されません。これが必要ない場合は、 LEFT JOIN を使用すると、 NULL を持つ行が 1 つ取得されます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

アプリにこのような 3 方向の結合が必要な場合もありますが、通常は上記のように 2 方向の結合のみが必要になるか、次のようになります。

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 の名前は表示されません)。

于 2008-12-02T18:01:48.043 に答える
6
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>
于 2008-12-02T18:06:27.363 に答える
1
SELECT p.name FROM person p 
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
于 2008-12-02T18:02:07.327 に答える
0
p.name を選択
pさん、友達fさんから
どこで f.friend_id = p.person_id
および f.person_id = 1
于 2008-12-02T18:07:05.303 に答える
0

Tony Andrews が正しいと確信していますが、正しい構文ではソース テーブルが左側に、結合されたテーブルが右側に配置されると思います...

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

これは、値がフィールドで見つかった[person.name]すべてのレコードのフィールドを返し、フィールドが 1 に等しい....[1] の友人であるすべての人は、結合されて制限されている場合、フィルター処理された人物テーブルに存在します。[person.person_id][friends.friend_id][friends.person_id]friends.person_id=[1]

于 2008-12-02T18:13:22.560 に答える