如何编写mysql查询来实现以下类型的连接(基于列的值加入)

时间:2016-04-27 10:20:07

标签: mysql database join

表用户:

id----email 
1-----s@s.com 
2-----p@p.com 

表user_buddies

id-----user_id----buddy_id----status enum('accepted','pending') 
1------1----------2-----------pending 

假设我正在查询用户2,那么我想获得用户2的电子邮件。如果我正在查询用户1,那么我想收到用户1的电子邮件。

以下查询始终返回空行。

SELECT
    users.email,
    ub1.*, ub2.*
FROM
    users
JOIN user_buddies ub1 ON users.id = ub1.user_id
JOIN user_buddies ub2 ON users.id = ub2.buddy_id
WHERE
    users.id = 1;

任何人都可以帮助我吗? 谢谢。

预期结果:

email-----user_id-----buddy_id-----status
s@s.com --1-----------2------------pending (If queryed on user 2)
p@p.com---1-----------2------------pending (If queried on user 1)

上下文

user1user2 发送请求时,只有一行添加到user_buddiesstatus=pending。因此,user1user2伙伴列表都是使用相同的行创建的。因此,如果查询user2所需的电子邮件是user2's

2 个答案:

答案 0 :(得分:0)

您可以查看以下查询:

SELECT
    users.email,
    ub1.user_id,
    ub1.buddy_id,
    ub1.`status`
FROM
    users
JOIN user_buddies ub1 ON users.id = ub1.user_id OR users.id = ub1.buddy_id
WHERE   users.id = 2;

SQL FIDDLE DEMO

<强>结果:

email      user_id     buddy_id     status
p@p.com       1           2         pending (if queried on users.id = 2)
s@s.com       1           2         pending (if queried on users.id = 1)

修改

SELECT
    (
        SELECT
            u.email
        FROM users u
        WHERE   u.id =
        IF (
            users.id = ub1.user_id,
            ub1.buddy_id,
            ub1.user_id
        )
    ) AS buddyEmail,
    ub1.user_id,
    ub1.buddy_id,
    ub1.`status`
FROM
    users
INNER JOIN user_buddies ub1 ON users.id = ub1.user_id
OR users.id = ub1.buddy_id
WHERE   users.id = 2;

Check this fiddle of this new query

答案 1 :(得分:0)

SELECT 'Userid' querysource, u.id, u.email, ub.*, u1.EMAIL AS Buddyemail
FROM @users u 
JOIN @user_buddies ub ON u.id = ub.user_id
JOIN @users u1 ON u1.id = ub.BUDDY_ID
WHERE u.id = 1

UNION

SELECT 'Buddyidid', u.id, u.email, ub.*, u1.email AS Buddyemail
FROM @users u 
JOIN @user_buddies ub ON u.id = ub.buddy_id 
JOIN @users u1 ON u1.id = ub.user_ID
WHERE u.id = 1