php - 如何从表中的 2 个值中 INNER JOIN 正确的值,其中 1 是正确的

标签 php mysql sql

我需要选择并加入与当前用户相反的正确的 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 是自增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 上加入 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 之一。

那么我怎么知道什么时候我的查询应该内部加入 u1u2,我在这里有点困惑我希望有人能帮助我,我正在考虑执行 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 记录,而 u2JOIN 作为关系另一端的用户。

这个 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/

相关文章:

mysql - 在 fedora16 上安装 mysql 和 mysql2 gems 失败

php - 警告 : mysql_fetch_array(): error

mysql - 对于非常小的(4 个字符)值,BIGINT UNSIGNED 值超出范围

php - 查询在 phpMyAdmin 中运行良好,但 0 导致 php 本身......?

mysql - RPG 任务 - 查询玩家数据

php - 尝试在 PHP 中将 mysqldump -v 弹出并没有得到输出

php - 找不到 Illuminate\Routing\Redirector::to ("user/login"的匹配处理程序)

php - 2个用户之间的Paypal退款

php - 确定查询在哪个页面上执行

php - SQL 排序方式 ... ASC