SQL/PHP-基于列值调用同一个表两次

SQL/PHP-基于列值调用同一个表两次,php,sql,prepared-statement,Php,Sql,Prepared Statement,以下是我的表格的一般设置: users ------------- user_id | user_first | user_last | user_friendlist 1 | John | Doe | 2,3 2 | Jimmy | John | 1,3 3 | Papa | John | 1,2 首先,我将使用user\u id选择上面的表并检索user\u friendlist 然后,我

以下是我的表格的一般设置:

users
-------------
user_id | user_first | user_last | user_friendlist
1       | John       | Doe       | 2,3
2       | Jimmy      | John      | 1,3
3       | Papa       | John      | 1,2
  • 首先,我将使用user\u id选择上面的表并检索user\u friendlist
  • 然后,我想使用user\u friendlist并首先检索user\u,最后检索user\u
  • 我尝试了Left JOIN,但我不确定如何调用同一个表两次。。。请帮忙!当试图做一个prepare语句时,它会变得非常混乱

    第一部分的通用代码:

    $selectData = $con->prepare("SELECT 
                                        user_friendlist
                                    FROM 
                                        users
                                    WHERE 
                                        user_id=?");
    
    
        $selectData->bind_param("i", $user_id); 
    
        $user_id = $_POST['user_id'];
    
        $selectData -> execute(); 
        $selectData-> bind_result($user_friendlist);    
    
        $arr = array();
        while (  $selectData -> fetch() ) {
            $arr[] = $user_friendlist;
        }
    
        echo json_encode($arr);
    

    您应该有两个表用户和朋友

    | user_id | freind_id | 
    | 1       | 2         |
    | 1       | 3         |
    | 2       | 1         |
    | 2       | 3         |
    | 3       | 1         |
    | 3       | 2         |
    
    用户会喜欢

    | user_id | user_first | user_last | 
    | 1       | John       | Doe       |
    | 2       | Jimmy      | John      |
    | 3       | Papa       | John      |
    
    SELECT users2.user_first AS friend_first,users2.user_last AS friend_last
    -- ,users1.user_first AS user_first,users1.user_last AS user_last 
    -- uncomment the last line to get the user info with his friends
    FROM users as users1
    join friends
    ON users1.user_id=friends.user_id
    JOIN users AS users2
    ON users2.user_id=friends.friend_id
    WHERE users1.user_id=1
    
    和朋友

    | user_id | freind_id | 
    | 1       | 2         |
    | 1       | 3         |
    | 2       | 1         |
    | 2       | 3         |
    | 3       | 1         |
    | 3       | 2         |
    
    user\u id
    是表
    users


    user\u id
    friend\u id
    是表
    friend

    friends.user\u id
    friends.friends\u id
    用户的外键。user\u id

    查询将类似于

    | user_id | user_first | user_last | 
    | 1       | John       | Doe       |
    | 2       | Jimmy      | John      |
    | 3       | Papa       | John      |
    
    SELECT users2.user_first AS friend_first,users2.user_last AS friend_last
    -- ,users1.user_first AS user_first,users1.user_last AS user_last 
    -- uncomment the last line to get the user info with his friends
    FROM users as users1
    join friends
    ON users1.user_id=friends.user_id
    JOIN users AS users2
    ON users2.user_id=friends.friend_id
    WHERE users1.user_id=1
    
    查询结果为

    | friend_first | friend_last |
    | Jimmy        | John        |
    | Papa         | John        |
    

    我强烈建议您将user_friendlist列去掉,并创建一个多对多表来将用户彼此关联起来。联接并不是真正设计为在包含多个键值的列上进行的。不是说你做不到,但这很难看/没有表现。多对多表将包含像friend\u request\u user\u id、friend\u repsonse\u user\u id这样的列(无论名称对您有何意义,并描述两个id字段之间的差异)您应该有另一个表名
    user\u-friend
    ,例如有两列
    user\u-id
    friend\u-id
    user\u-id
    将是列
    用户的外键。user\u-id
    和您正在使用的
    mysqli
    不是
    pdo
    对吗?我希望保留所有用户一个屋檐下的信息。。我想最好将friendlist分离到另一个表中,并使用LEFT JOIN调用用户来检索名字和姓氏?很好,谢谢!我会用这个来代替我原来的split by,以及所有那些讨厌的东西。等等,这个查询有问题,我会尽快解决。我会设置DB:P谢谢你的双重检查第一次修复并测试它是选择用户名而不是他的friendshow来检索friends.user\u id以及user\u first和user\u last?我想我能弄明白,但不知道你是否知道,只要对脚本稍作修改:P