mysql以on条件连接2个表,保留一些值

mysql以on条件连接2个表,保留一些值,mysql,jointable,Mysql,Jointable,我有两张桌子 usersid,username和linksid,usernameORid 行示例:用户{[1,test],[2,stack]}和链接{[1,overflow],[2,1]} 因此,表链接可能包含来自表用户的用户名或id。正如您在示例中所看到的, 链接中的usernameORid不能包含用户的id或用户名。 我希望你能理解我的例子 现在,我有一个疑问: 但是,我怎样才能做到这一点呢 用户角色id、用户id、角色id您可以在链接和用户之间的连接中使用OR语句。这将允许您拾取link.

我有两张桌子

usersid,username和linksid,usernameORid

行示例:用户{[1,test],[2,stack]}和链接{[1,overflow],[2,1]}

因此,表链接可能包含来自表用户的用户名或id。正如您在示例中所看到的, 链接中的usernameORid不能包含用户的id或用户名。 我希望你能理解我的例子

现在,我有一个疑问:

但是,我怎样才能做到这一点呢


用户角色id、用户id、角色id

您可以在链接和用户之间的连接中使用OR语句。这将允许您拾取link.usernameORid等于users.id或users.username的用户记录

此外,如果希望在users表缺少匹配项时,返回的第2列或第3列保留l.usernameORid中的值。。。如果您的users.id始终是数字,您可以使用CASE语句进行一些欺骗:

SELECT  
    l.usernameORid,
    Coalesce(u.username, CASE WHEN .lusernameORid REGEXP '^[0-9]+$' THEN NULL ELSE l.usernameORid END) as username,
    Coalesce(u.username, CASE WHEN .lusernameORid REGEXP '^[0-9]+$' THEN l.usernameORid ELSE NULL END) as userid
FROM links l
LEFT JOIN 
    (   
        SELECT
            users.username,
            users.idusers
        FROM
            users
            LEFT JOIN user_roles ON
                user_roles.userID = users.id
        WHERE 
            user_roles.roleID < 4
    ) u ON
        l.usernameORid= u.id OR
        l.usernameORid = u.username
group by u.id
但是请记住,如果users表与links.usernameORid不匹配,则只能确定用户名或id,因此这两个字段中的一个字段将为NULL。

将最终WHERE条件更改为:

WHERE ur.roleID < 4 OR u.id IS NULL

这将允许它返回在用户中不匹配的行。通常情况下,左连接本身就可以完成这项工作,但由于您正在该表上进行额外的连接,WHERE子句会过滤掉那些不匹配的行,因为它们没有roleID。

userID=1的角色是什么?如果它不小于4,则不会包括在内。由于usernameORid在用户中不存在,因此它将不在user_角色中。这似乎不能解决问题,因为username=overflow的用户中没有行。我在中添加了额外的逻辑来执行子查询。但是,只有在用户表中没有匹配的用户时,才能填写l.usernameORid。u、 用户名和u.id将为空。再次编辑以添加第三条语句,该语句将填充查询返回的第二个或第三个字段,具体取决于l.usernameORid字段是用户名还是id。完美且简单。非常感谢,先生。
SELECT l.usernameORid,
    u.username,
    u.id
FROM links l
LEFT JOIN users u ON 
    l.usernameORid = u.id OR
    lusernameORid = u.username
LEFT JOIN user_roles ur
    ON ur.userID = u.id
WHERE ur.roleID < 4
GROUP BY u.id
SELECT  
     l.usernameORid,
     u.username,
     u.id
FROM links l
LEFT JOIN 
    (   
        SELECT
            users.username,
            users.idusers
        FROM
            users
            LEFT JOIN user_roles ON
                user_roles.userID = users.id
        WHERE 
            user_roles.roleID < 4
    ) u ON
        l.usernameORid= u.id OR
        l.usernameORid = u.username
group by u.id
SELECT  
    l.usernameORid,
    Coalesce(u.username, CASE WHEN .lusernameORid REGEXP '^[0-9]+$' THEN NULL ELSE l.usernameORid END) as username,
    Coalesce(u.username, CASE WHEN .lusernameORid REGEXP '^[0-9]+$' THEN l.usernameORid ELSE NULL END) as userid
FROM links l
LEFT JOIN 
    (   
        SELECT
            users.username,
            users.idusers
        FROM
            users
            LEFT JOIN user_roles ON
                user_roles.userID = users.id
        WHERE 
            user_roles.roleID < 4
    ) u ON
        l.usernameORid= u.id OR
        l.usernameORid = u.username
group by u.id
WHERE ur.roleID < 4 OR u.id IS NULL