我需要选择并加入与当前用户相反的正确的 u1 或 u2 以显示具有正确图片/id 的正确 friend 列表
session 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
是自增idu1_fk
是参与(提交好友请求)的第一个用户 idu2_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 上加入 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 并在第二个查询中执行 where 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
表示当前 session ID 的 users
记录,而 u2
是 JOIN
作为关系另一端的用户。
这个 demo on DB Fiddle 示例数据返回, session ID 1
:
| id | u1 | u2 | userid | username | picture |
| --- | --- | --- | ------ | --------------- | ----------- |
| 1 | 1 | 2 | 2 | anotherusername | another.jpg |
| 1 | 3 | 1 | 3 | thirdusername | third.jpg |
关于php - 如何从表中的 2 个值中 INNER JOIN 正确的值,其中 1 是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54972982/