我需要选择并内部加入与当前用户相反的正确u1或u2,以显示具有正确图片/ id的正确朋友列表
评估编号
$sess_id = $_SESSION['user']['id'];
关系表:
id u1_fk u2_fk u_action status
-------------------------------------------------
1 1 2 2 5
-------------------------------------------------
1 3 1 3 5
细节:
> ID是自动递增ID
> u1_fk是参与的第一个用户ID(已提交朋友请求)
> u2_fk是另一个用户的ID(得到好友请求的用户)
> u_action是最后一个执行操作的用户(例如,发送了好友请求,拒绝/接受了好友请求,阻止了其他用户等)
用户表:
user_id user_username user_picture
-------------------------------------------------
1 someusername me.jpg
-------------------------------------------------
2 anotherusername another.jpg
-------------------------------------------------
3 thirdusername third.jpg
sql PHP(在此我对user_id进行INNER JOIN u_action):
$sql = "SELECT t1.id as id, "
. " t1.u1_fk as u1, "
. " t1.u2_fk as u2, "
. " t2.user_id as userid, "
. " t2.user_username as username, "
. " t2.user_picture as picture "
. " FROM relationships t1 "
. " INNER JOIN users t2 "
. " ON t1.u_action = t2.user_id "
. " WHERE (t1.u1_fk = :user_one "
. " OR t1.u2_fk = :user_two) "
. " AND t1.relationship_status = 5 ";
$stmt = $dbCon->prepare($sql);
$stmt->bindParam(":user_one", $sess_id);
$stmt->bindParam(":user_two", $sess_id);
$stmt->execute();
$count = $stmt->rowCount();
if ($count > 0) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
我以为可以使用u_action,但这显然仅对其中之一有效,因为它是该字段中存储的2个用户ID之一.
所以我怎么知道每当我的查询应该内部连接u1或u2时,我有点困惑,我希望有人可以帮帮我,我正在考虑执行2个查询并对所有结果进行排序,并删除用户自己的id并执行在第二个查询中的in子句中,但是我想知道是否可以仅通过1个查询来完成.
数据库的结果应该是什么样子.
在这个特定示例中,从sess_id为1的数据库中得到的结果是我想要的:
id u1_fk u2_fk userid username picture
------------------------------------------------------------------
1 1 2 2 anotherusername another.jpg
------------------------------------------------------------------
1 3 1 3 thirdusername third.jpg
在这个特定示例中,从sess_id = 2的数据库中得到的结果是我想要的
id u1_fk u2_fk userid username picture
------------------------------------------------------------------
1 1 2 2 someusername me.jpg
------------------------------------------------------------------
解决方法:
SELECT
r.id as id,
r.u1_fk as u1,
r.u2_fk as u2,
u2.user_id as userid,
u2.user_username as username,
u2.user_picture as picture
FROM
users u1
INNER JOIN relationship r
ON r.status = 5
AND (r.u1_fk = u1.user_id OR r.u2_fk = u1.user_id)
INNER JOIN users u2
ON u2.user_id <> u1.user_id
AND (r.u1_fk = u2.user_id OR r.u2_fk = u2.user_id)
WHERE
u1.user_id = :sessid
u1代表当前会话ID的用户记录,而u2作为关系另一端的用户加入.
带有示例数据的demo on DB Fiddle返回了会话ID 1:
| id | u1 | u2 | userid | username | picture |
| --- | --- | --- | ------ | --------------- | ----------- |
| 1 | 1 | 2 | 2 | anotherusername | another.jpg |
| 1 | 3 | 1 | 3 | thirdusername | third.jpg |