MySQL三表加入 - 用户和朋友的图片

时间:2012-12-18 03:25:15

标签: php mysql sql database join

已经尝试了几个小时 - 不幸的是我被困在这个三桌加入。

问题是我可以检索用户朋友的所有照片。但我想要朋友的照片和用户的照片。但是,我不确定这个的语法。

这是我的表结构:

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攻击。

我还打算将用户添加为自己的朋友 - 这是否可以接受?

2 个答案:

答案 0 :(得分:1)

您需要针对pictures进行额外加入 - 一个用于获取用户的照片,另一个用于获取朋友的照片。别名不同。

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...

答案 1 :(得分: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被转义,或者甚至更好地使用参数化查询。