LEFT JOIN 与主查询的相对值
LEFT JOIN with relative value from main query
我有两个 table:用户 和 友谊。例如:
用户 table:
id | user | email | website
1 | Igor | i@o.com | stack.com
2 | Lucas | a@i.com | overflow.com
3 | John | j@w.com | www.com
友谊 table(当status = 2
表示他们是朋友时):
id | friend1 | friend2 | status
1 | Igor | John | 2
2 | Lucas | Igor | 2
3 | John | Lucas | 2
然后我对 select 朋友(其中 $user
是当前登录的用户)执行以下操作:
SELECT friend1, friend2
FROM friendship
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
但是我也想selectuserstable中的用户数据,因此,我会这样做:
SELECT friend1, friend2
FROM friendship
LEFT JOIN users
ON user = **friend**
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
在上面的ON子句中,我在friend这个词里打上了星号,大家看看我的疑惑在哪里。我只想 select table users 中的数据而不是当前登录的用户($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 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
这很容易通过简单的 JOIN
完成,其中只包含您的逻辑:
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'
我有两个 table:用户 和 友谊。例如:
用户 table:
id | user | email | website
1 | Igor | i@o.com | stack.com
2 | Lucas | a@i.com | overflow.com
3 | John | j@w.com | www.com
友谊 table(当status = 2
表示他们是朋友时):
id | friend1 | friend2 | status
1 | Igor | John | 2
2 | Lucas | Igor | 2
3 | John | Lucas | 2
然后我对 select 朋友(其中 $user
是当前登录的用户)执行以下操作:
SELECT friend1, friend2
FROM friendship
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
但是我也想selectuserstable中的用户数据,因此,我会这样做:
SELECT friend1, friend2
FROM friendship
LEFT JOIN users
ON user = **friend**
WHERE (friend1 = '$user' OR friend2 = '$user') AND status = 2
在上面的ON子句中,我在friend这个词里打上了星号,大家看看我的疑惑在哪里。我只想 select table users 中的数据而不是当前登录的用户($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 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
这很容易通过简单的 JOIN
完成,其中只包含您的逻辑:
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'