mysql以on条件连接2个表,保留一些值
我有两张桌子 usersid,username和linksid,usernameORid 行示例:用户{[1,test],[2,stack]}和链接{[1,overflow],[2,1]} 因此,表链接可能包含来自表用户的用户名或id。正如您在示例中所看到的, 链接中的usernameORid不能包含用户的id或用户名。 我希望你能理解我的例子 现在,我有一个疑问: 但是,我怎样才能做到这一点呢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.
用户角色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