0

現在、データベースに 3 つの MySQL テーブルがあり、それらをすべて結合してデータを比較する方法を考えていました。

クエリは、現在余暇にサイド プロジェクトとして取り組んでいる「敵か味方か」システムの一部ですが、一生それを解決することはできません。2 つのテーブルの結合は成功しましたが、3 つのテーブルの結合ではうまくいきません。

何はともあれ、テーブルレイアウトです。

表1

Unique ID | Username | Password | Activity
1         | SomeUser | password | Active
2         | NewUsers | password | InActive
3         | GuestUse | password | Active

表 2

FileID    | UploadedBy | Type | FileName | Description
1         | SomeUser   | MP3  | Demo.mp3 | Bass Guitar Riff
2         | SomeUser   | MP4  | Demo.mp4 | Some Youtube Video

表 3

ListOwner | Friends  | Foes
SomeUser  | GuestUse | NULL
GuestUse  | SomeUser | NULL

私が達成しようとしているのは、「ListOwner」が自分の「友達」リストにいるユーザーがアップロードしたファイルを表示できることだけです。当然、アップロードされたすべてのファイルを表示できるページがありますが、これはより設計されていますあなたがより高く評価する人々のアップロードを見る。

本質的に、クエリを読み取ろうとしています。Table1 の「Username」、Table2 の「UploadeBy」、Table3 のすべて

例: GuestUse がログインすると、クエリはこの情報を取得し、彼のユーザー名を表 3 と比較して、彼の友人リストにあるユーザーからのアップロードのみを表 2 に表示します。

構造については、DB には次の設定があります。

  • 一意の ID とフィールド ID は両方とも INT(4) です
  • ユーザー名は VARCHAR(42) です
  • パスワードは VARCHAR(30) です
  • アクティビティは VARCHAR(8)
  • ListOwner は VARCHAR(42) < ユーザー名と同じ
  • 味方と敵はテキスト

あなたが与えることができるどんな助けも大歓迎です.

4

2 に答える 2

0

表 2 のフィールド「uploadedby」は、数値のユーザー ID である必要があります。

FileID    | UploadedBy | Type | FileName | Description
1         | 1          | MP3  | Demo.mp3 | Bass Guitar Riff
2         | 1          | MP4  | Demo.mp4 | Some Youtube Video

「友」関係用に 1 つのテーブルを作成し、「敵」関係用に 1 つのテーブルを作成する必要があります。

Table 3: friends
ListOwnerId | FriendId
1           | 2
1           | 3
2           | 1

Table 4: foes
ListOwnerId | FoeId
3           | 2

次に、クエリを内側から外側に進めます。

SELECT friendid FROM friends WHERE listowner=$loginid;

これにより、$loginid ユーザーのすべてのフレンドが抽出されます。

$someuseris が $loginid フレンド リストに含まれているが、$someuserid が $loginid を敵として設定している場合、$loginid は $someuserid ファイルを参照する必要がありますか? それを考えてください。その間、敵テーブルは役に立たない。

次に、友達からすべてのファイルを選択します。

SELECT * FROM files WHERE uploadedby IN (SELECT friendid FROM friends WHERE listowner=$loginid)

このクエリは、目的のファイルのリストを提供します。

これはサブクエリで実行されますが、結合でも実行できます。

SELECT files.* FROM files JOIN friends ON files.uploadedby=friends.friendid WHERE friends.listowner=$loginid;
于 2013-03-07T16:36:21.250 に答える
0

これを試してください:

select t1.Username,
t3.ListOwner,t3.Friends,t3.Foes,
t2.UploadedBy,t2.Type,t2.FileName,t2.Description
from Table1 t1
inner join Table3 t3 on t1.Username = t3.ListOwner
inner join Table2 t2 on t3.Friends = t2.UploadedBy
where Username = 'GuestUse';
于 2013-03-07T16:36:33.840 に答える