4

何時間も試みてきました - 残念ながら、私はこの 3 つのテーブルの結合で立ち往生しています。

問題は、ユーザーの友人の写真をすべて取得できることです。しかし、友達の写真とユーザーの写真が必要です。ただし、これの構文はわかりません。

これが私のテーブル構造です:

active_users: id, username, name, etc...
friends: relationship_id (PK), friend1_ID (FK), friend2_ID (FK), status
pictures: picture_id (PK), user_id (FK), name, date, etc.

したがって、ユーザーの友人の写真を取得するために現在必要なステートメントは次のとおりです。

SELECT p.*, a.username
FROM friends f
JOIN active_users a ON (f.friend_1ID='$userID' AND f.friend_2ID=a.id AND status=1)
JOIN pictures p ON (p.user_id=f.friend_2ID)

ユーザーの写真を含めるようにこれを変更するにはどうすればよいですか? UNION を使ってそれを行うことはできますが、ユーザー入力による方法がある場合、これはコストがかかり、SQL 攻撃を受けやすいと思います (または言われたことがあります)。

ユーザーを自分自身に友達として追加することも検討しましたが、これは受け入れられますか?

4

2 に答える 2

1

pictures1 つはユーザーの写真を取得するためのもので、もう 1 つは友人の写真を取得するためのものです。それらに異なる別名を付けます。

SELECT
  /* Note below about SELECT * here... */ 
  puser.*,
  pfriend.*,
  a.username
FROM 
  friends f
  /* We assume $userID is already validated and escaped */
  JOIN active_users a ON (f.friend_1ID='$userID' AND f.friend_2ID=a.id AND status=1)
  /* Join once for the user friend_1ID */
  LEFT JOIN pictures puser ON (puser.user_id = f.friend_1ID)
  /* And again for the friend friend_2ID */
  LEFT JOIN pictures pfriend ON (pfriend.user_id = f.friend_2ID)

ここで選択リストで使用すると問題が発生することに注意してください*。列名をフェッチすると列名があいまいになるためです。あいまいさをなくすために、列を個別にリストしてエイリアスを作成する必要があります。

SELECT
  puser.picture_id AS puser_picture_id,
  puser.othercol AS puser_other,
  pfriend.picture_id AS pfriend_picture_id,
  pfriend.othercol AS pfriend_other,
  a.username
FROM...
于 2012-12-18T03:31:49.590 に答える
1

友達またはユーザーに参加するように参加を変更できます。

SELECT p.*, IF(p.user_id = friend_2ID, a.username,'$username')
FROM friends f
JOIN active_users a ON (f.friend_1ID='$userID' AND f.friend_2ID=a.id AND status=1)
JOIN pictures p ON (p.user_id=f.friend_2ID OR p.user_id = '$userID')
GROUP BY p.photo_id

$userID がエスケープされていることを確認するか、パラメータ化されたクエリを使用することをお勧めします。

于 2012-12-18T03:31:57.527 に答える