0

私は3つのテーブルを持っています

  1. user(id,fname,lname)
  2. picture(picid,pic_path,userid)
  3. friends(friend_of,friends_id,status)

id,fname,lname,pic_pathすべてfriends_idfriends_of=1 画像パスを取得したいのですが
、事前に感謝します。

4

3 に答える 3

1

あなたが探しているものは結合と呼ばれます。特に、JOINとLEFTJOINを探しています。

SELECT 
    user.id, user.fname, user.lname, picture.pic_path 
FROM 
    friends 
    JOIN user 
        ON user.id = friends_id 
    LEFT JOIN picture 
        ON userid = user.id 
WHERE 
    friends.friend_of = 1

ただし、これは、に最大1つのエントリがある場合にのみ機能しpictureます。

これはあなたの当面の質問に答えますが、結合に非常に精通することをお勧めします。これらは、リレーショナルデータベースの基本的な操作の1つです。(結合は本質的に数学的な関係であることに注意してください)

于 2012-05-15T07:15:28.513 に答える
0

このようなクエリでは、エンティティ間の関係を理解し​​、採用する必要があります。次に、選択と射影の 2 つのステップで作業します。SQL 構文とは逆に、FROM キーワードの前の部分が射影です。

まず、データをコンパイルします。明らかに、3 つのテーブルすべてのデータが必要であり、一度だけ必要です。したがって、最初に、3 つのテーブルすべてを結合して、考えられるすべての組み合わせを作成します。SQL では、これは FROM 部分で行われます。

FROM friends f, picture p, user u

f、p、および u は、以下で完全なテーブル名を入力する手間を省く目的で使用されるエイリアスです。

これで、すべての可能な組み合わせができました。必要なものを選択しましょう。DB 内のすべての画像は、DB にも保存されているユーザーに属していると思います。したがって、ユーザーに関連付けられた写真のみが必要であると想定しています。したがって、以前に作成したすべての組み合わせに最初の制限があります。データベースに保存されているデータの(おそらく)意味から導き出された制限であり、次のように述べられています。

u.id = p.userid

(注意: 上記の組み合わせにこの制限を適用することにより、特定の組み合わせのみを「選択」します。)

次に、別の制限をリクエスト「friends_of=1」としてすでに述べて、この制約を私たちが書いた組み合わせに関連付けます。

f.friends_of=1

次に、リクエスト「friends_of=1」を他のデータと結合します。

f.friend_of = u.id

この制約は、誰かの友人であるユーザーのみを選択します。これで、これらの制約を組み合わせることができます。すべての制約が満たされるようにするため、WHERE ステートメントでそれらを AND します。

WHERE u.id = p.userid AND f.friend_of = u.id AND f.friends_of=1

順序は意味に影響しません (この場合。ただし、これらの制約を再考しましょう: u.id = p.userid : ユーザーに関する情報と、そのユーザーに関連付けられた写真が必要です f.friend_of = u.id : 探しているもの誰かの友達であるユーザー f.friends_of=1 : 特定の誰かの友達を探しています

次に、DB に保存されているデータを必要なものに射影します。すべてのユーザー データと画像パスが必要です。SQL では:

SELECT u.*,p.pic_path

今、すべてをまとめました。

SELECT u.*,p.pic_path FROM friends f, picture p, user u WHERE u.id = p.userid AND f.friend_of = u.id AND f.friends_of=1

写真が関連付けられていない友達を許可するには (注: pic_path が NULL である場合とは大きく異なります)、外部結合が必要です。つまり、空のセットとの組み合わせも必要になります。それは私のMySQLがあまり良くないところですが、あなたが望むすべての組み合わせ(そしてもっと多くのもの)を次のように生成すると思います:

FROM friends f JOIN user u LEFT JOIN picture p ON u.id = p.userid

SELECT u.*,p.pic_path FROM friends f JOIN user u LEFT JOIN picture p WHERE  f.friend_of = u.id AND f.friends_of=1

違反する可能性のある制約は、組み合わせを作成する方法に関する規則として、一般的な選択からデータ組み合わせの生成に移動することによって明示されていることに注意してください。はい、それは選択と投影の考え方に従うのではなく、近道です。

于 2012-05-15T08:06:56.983 に答える
0

これを試して

SELECT u.*,p.*,f.*
FROM USER u
LEFT JOIN picture p ON p.user_id = id
INNER JOIN friends f ON f.friends_of = u.id
WHERE f.friends_id = 1
于 2012-05-15T07:25:55.280 に答える