Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
Mysql 使用主查询中的相对值进行左连接_Mysql_Sql_Join_Left Join - Fatal编程技术网

Mysql 使用主查询中的相对值进行左连接

Mysql 使用主查询中的相对值进行左连接,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我有两张桌子:用户和友谊。例如: 用户表: 状态=2时的友谊表表示他们是朋友: id | friend1 | friend2 | status 1 | Igor | John | 2 2 | Lucas | Igor | 2 3 | John | Lucas | 2 我执行以下操作来选择$user是当前登录用户的好友: SELECT friend1, friend2 FROM friendship WHERE (friend1 = '$user' OR

我有两张桌子:用户和友谊。例如:

用户表:

状态=2时的友谊表表示他们是朋友:

id | friend1 | friend2 | status
1  | Igor    | John    | 2
2  | Lucas   | Igor    | 2
3  | John    | Lucas   | 2
我执行以下操作来选择$user是当前登录用户的好友:

SELECT friend1, friend2 
FROM friendship 
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
但我还想在users表中选择用户数据,因此,我会:

SELECT friend1, friend2 
FROM friendship 
LEFT JOIN users 
ON user = **friend** 
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
在上面的ON子句中,我在“朋友”一词中留下了星号,请看我的疑问在哪里。我只想选择表users中的数据,而不是当前用户logged$user,我知道我应该使用它来验证CASE是否等于登录用户,但我不知道在这种情况下如何执行此操作。

我认为您可以使用

select * from user where 
user in (
    select friends1 from friendship where friend2='$user' and status=2
    union all
    select friends2 from friendship where friend1='$user' and status=2
)
我添加了左连接示例

select u.* from (
    select friends1 f from friendship where friend2='$user' and status=2
    union all
    select friends2 f from friendship where friend1='$user' and status=2) a
left join user u on a.f=u.user
我想你可以用

select * from user where 
user in (
    select friends1 from friendship where friend2='$user' and status=2
    union all
    select friends2 from friendship where friend1='$user' and status=2
)
我添加了左连接示例

select u.* from (
    select friends1 f from friendship where friend2='$user' and status=2
    union all
    select friends2 f from friendship where friend1='$user' and status=2) a
left join user u on a.f=u.user

这适用于您的示例数据,假设您想要友谊中两个朋友的用户信息:

SELECT f.friend1, u1.id, u1.email, u1.website, f.friend2, u2.id, u2.email, u2.website
FROM friendship f
INNER JOIN users u1
ON f.friend1 = u1.user 
INNER JOIN users u2
ON f.friend2 = u2.user
WHERE (friend1 = '$user' OR friend2 = '$user')
AND f.status = 2

这适用于您的示例数据,假设您想要友谊中两个朋友的用户信息:

SELECT f.friend1, u1.id, u1.email, u1.website, f.friend2, u2.id, u2.email, u2.website
FROM friendship f
INNER JOIN users u1
ON f.friend1 = u1.user 
INNER JOIN users u2
ON f.friend2 = u2.user
WHERE (friend1 = '$user' OR friend2 = '$user')
AND f.status = 2

只需包含逻辑的简单联接即可轻松完成此操作:

SELECT
    U.id,
    U.user,
    U.email,
    U.website
FROM
    Friendship F
INNER JOIN Users U ON
    (U.user = F.friend1 AND F.friend1 <> '$user') OR
    (U.user = F.friend2 AND F.friend2 <> '$user')
WHERE
    F.friend1 = '$user' OR F.friend2 = '$user'

只需包含逻辑的简单联接即可轻松完成此操作:

SELECT
    U.id,
    U.user,
    U.email,
    U.website
FROM
    Friendship F
INNER JOIN Users U ON
    (U.user = F.friend1 AND F.friend1 <> '$user') OR
    (U.user = F.friend2 AND F.friend2 <> '$user')
WHERE
    F.friend1 = '$user' OR F.friend2 = '$user'


您可能希望加入users表两次,一次加入friend1,一次加入friend2。请参见我对类似问题的回答:@fredrover,如果我使用您的解决方案。如何处理foreach中的数据?我明白你的意思:每次通过循环,你都会有2个用户的数据。但其中一个总是一样的,因为它就是您查询的那个。正如您所说,您不需要该用户的数据,因此这可能在查询本身中得到更好的解决,我的建议可能不会有任何帮助。您可能希望加入users表两次,一次加入friend1,一次加入friend2。请参见我对类似问题的回答:@fredrover,如果我使用您的解决方案。如何处理foreach中的数据?我明白你的意思:每次通过循环,你都会有2个用户的数据。但其中一个总是一样的,因为它就是您查询的那个。正如您所说,您不需要该用户的数据,因此这可能在查询本身中得到更好的解决,我的建议可能不会有帮助。连接比子查询效率高很多。任何建议示例,@Dagon?Kiro都可以轻松地将in转换为连接。工会的速度可能会快于或,只是别忘了在状态字段中添加检查。谢谢提醒我。如果某些用户在友谊中,但不在用户表中,则2次查询的结果可能会有所不同。您对每个用户的意思是什么?你是说域名吗?如果使用星型查询,则字段名应该相同。联接比子查询效率高很多。任何建议示例,@Dagon?Kiro都可以轻松地将IN转换为联接。工会的速度可能会快于或,只是别忘了在状态字段中添加检查。谢谢提醒我。如果某些用户在友谊中,但不在用户表中,则2次查询的结果可能会有所不同。您对每个用户的意思是什么?你是说域名吗?如果使用star查询,则字段名称应相同i仅希望用户信息用于非当前记录的$userI仅希望用户信息用于非当前记录的$userNot worked。只返回了一个表friendships的结果,其中有两行是用户记录的Friends2。我只运行了几个测试,所有结果都正确返回。我会检查你是如何复制的。明天我会做更多的测试,让你再次查询,所以我会评论结果不起作用。只返回了一个表friendships的结果,其中有两行是用户记录的Friends2。我只运行了几个测试,所有结果都正确返回。我会检查你是如何复制的。明天我会做更多的测试,让你再次查询,所以我会对结果进行评论