Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP子查询选择所有用户';s在朋友表中与我是朋友的个人资料_Php_Mysql - Fatal编程技术网

PHP子查询选择所有用户';s在朋友表中与我是朋友的个人资料

PHP子查询选择所有用户';s在朋友表中与我是朋友的个人资料,php,mysql,Php,Mysql,在这里发布问题之前,我做了几个小时的研究,但运气不好。 让我们从表中的示例开始,这样您就很容易理解我要做的事情: 在配置文件表中,我注册了配置文件,其配置文件id为: 约翰123 joee 史密斯 哈西 上面的配置文件是彼此的朋友,朋友表由两个属性组成,即profile_one和profile two。以下是他们是如何成为朋友的: 约翰123与乔的朋友 约翰123与史密斯的朋友 约翰123与哈西的朋友 哈西和乔是朋友 哈西和史密斯是朋友 当我尝试获取当前登录用户的好友时,它工作正常,并使用以下

在这里发布问题之前,我做了几个小时的研究,但运气不好。 让我们从表中的示例开始,这样您就很容易理解我要做的事情:

在配置文件表中,我注册了配置文件,其配置文件id为:
约翰123
joee
史密斯
哈西

上面的配置文件是彼此的朋友,朋友表由两个属性组成,即profile_one和profile two。以下是他们是如何成为朋友的:

约翰123与乔的朋友
约翰123与史密斯的朋友
约翰123与哈西的朋友

哈西和乔是朋友
哈西和史密斯是朋友

当我尝试获取当前登录用户的好友时,它工作正常,并使用以下查询返回true:

$query = $this->db->query("SELECT profile_one, profile_two 
                           FROM friendsTbl
                           WHERE profile_one = '{$this->myID}' OR profile_two = '{$this->myID}'")
现在我还想获取这些用户的配置文件信息,以便显示他们的名字和姓氏,因此我使用了如下的子查询,但是它返回false,我得到了一个错误,这是致命的错误:对非对象调用成员函数fetch_array()。该错误显示在我使用while循环的行上。子查询:

$query = $this->db->query("SELECT profile_id FROM profileTbl
                           WHERE profile_id IN (SELECT profile_one, profile_two 
                           FROM friendsTbl
                           WHERE profile_one = '{$this->myID}' OR profile_two = '{$this->myID}')");
如上所述,上述返回错误和致命错误。 我真的很感谢你的帮助,因为我已经尝试了一天左右没有任何运气

注意:我正在为这个项目使用类和函数,因此它是面向对象的


@约翰,在你修改了质询之后。以下是正在输出的内容:
注意:未定义索引:profile_one在第609行您不能在子查询中选择两个内容

SELECT profile_id FROM profileTbl
WHERE profile_id IN (SELECT profile_one, profile_two # issue here
FROM friendsTbl
WHERE profile_one = '{$this->myID}' OR profile_two = '{$this->myID}')
基本上就是说,其中id=1,2,其中1和2是列

您可以尝试使用
案例
语句

SELECT profile_id 
FROM profileTbl
WHERE profile_id IN 
(   SELECT 
        CASE WHEN profile_one = '{$this->myID}' THEN profile_one
             WHEN profile_two = '{$this->myID}' THEN profile_two 
        END
FROM friendsTbl
)

我不认为您有理由使用子查询。如果可以使用子查询来完成某些事情,那么很有可能使用
连接来完成。如果可能的话,使用
JOIN
是更好的解决方案,通常更快

尝试使用类似的查询:

SELECT 
    friendsTbl.*,
    profileTbl.*
FROM friendsTbl
LEFT JOIN profileTbl ON (profile_name = IF(friendsTbl.profile_one = 'john123',friendsTbl.profile_two, friendsTbl.profile_one) )
WHERE friendsTbl.profile_one = 'john123' OR friendsTbl.profile_two = 'john123'

下面是一个示例,它显示了用户的所有朋友
john123

我认为问题在于您的模式。在存储友谊的n-n关系表中(
friendsTbl
),应该在两列上强制执行唯一的复合索引,并使每一列特定于关系的一部分。这样,您可以将第一列profile_one(并将其重命名)视为
profile
,将第二列视为
friends_with
。那么,要想知道你是谁的朋友:

SELECT friends_with
FROM FriendsTbl
WHERE profile = {your_profile_id}

有没有其他方法来完成我想做的事情?谢谢John,至少我得到了一个不同的输出,正如我使用var dumb($query)看到的那样,它返回true。我得到了错误,未定义的索引:friend_one和friend_two。而且,它现在说我有1个朋友,而不是2个,所以我调试了while循环,while循环只选择第一行的一个字段并跳过其余字段。while循环是while($row=$query->fetch_array()){$result[]=$row;}@jamesmith您能自己执行查询吗。。。就像不是在php中,而是在phpmyadmin或mysql workbench中一样?我试过了,如果我用$this->myID替换它,它只会显示john123,因为这是用户会话。它不会显示与john123是朋友的用户,他们是joee、smith和hassey。@Jamesmith听起来好像你需要调试php代码。。该查询返回您想要的结果:)james如果您能阅读关于如何询问适当的mysql问题的内容,它将使我能够编辑/测试我的答案,并确保它解决了您的问题,但是上面的代码仅在我将friendsTbl.profile\u one=1或friendsTbl.profile\u two=1的1替换为0时有效,而且foreach循环也不可用正如我在调试中看到的那样,获取这些用户的配置文件信息,而不是我自己的信息。它确实显示了我的朋友,但没有得到他们的信息。如果它真的可以,那就太好了,因为这正是我想要的。我确信它能工作,我在测试数据库上测试了它。稍后我将添加一个SQLFIDLE。这是SQLFIDLE-。显然,我忘了替换查询中的一列,因此它工作不正常。我用$this->myID替换了它,它工作得很好:)谢谢,还可以输出两个用户的名字和姓氏吗?John123用户的名字和姓氏?谢谢Alex,但有个问题。例如,如果我添加一个朋友,我的用户ID将存储在属性列中,朋友的用户ID将存储在profile_two属性中,但如果他们将我添加到profile_two属性中,则会发生相反的情况,我是PHP的中间人,我真的不知道如何将我的ID存储在profile属性中,而朋友ID存储在friends_with属性中。有什么我可以在谷歌上搜索的关键词建议吗?或者你能提供给我的任何链接?
SELECT 
    friendsTbl.*,
    profileTbl.*
FROM friendsTbl
LEFT JOIN profileTbl ON (profile_name = IF(friendsTbl.profile_one = 'john123',friendsTbl.profile_two, friendsTbl.profile_one) )
WHERE friendsTbl.profile_one = 'john123' OR friendsTbl.profile_two = 'john123'
SELECT friends_with
FROM FriendsTbl
WHERE profile = {your_profile_id}