(mysql)如何在与另一个表连接时在where条件上添加通配符?

kre*_*mik 2 mysql

我有一个需要一些更改的查询,我没有得到任何线索这样做:

这是我的查询:

select * from user_data a
left join user_group b 
on (a.role like b.role)
Run Code Online (Sandbox Code Playgroud)

实际上userdata中的角色值是(varchar)'staff'

和组中的角色价值是(varchar)'员工;安全;财务'

所以我没有得到我预期的结果..

我想这个查询应该类似于:

select * from user_data a
left join user_group b 
on (b.role like a.role+";%") // using wildcard
Run Code Online (Sandbox Code Playgroud)

我仍然不知道使用通配符对这种情况的正确查询

任何人都可以帮忙吗?

mat*_*fee 5

你可以使用CONCAT:

select * from user_data a
left join user_group b 
on (b.role like CONCAT(a.role,";%")) // using wildcard
Run Code Online (Sandbox Code Playgroud)

注意 - b.role只需要a.role在开头匹配吗?如果它是security;staff;finance什么?你可以做到CONCAT('%',a.role,'%').

你可以做CONCAT('%','a.role','%')处理匹配a.role在任何位置,但只有当你能确保你不会有嵌套的角色.例如:如果b.rolestaffa.rolefinance;gardenstaff;security,那么该行将从查询即使作用是返回gardenstaff,而不是员工.

作为替代方案,您可以使用RLIKE而不是LIKE.这基本上是一个正则表达式LIKE.

特别是,正则表达式[[:<:]]staff[[:>:]]将匹配整个单词 staff.在[[:<:]][[:>:]]代表字边界,它阻止你匹配staffgardenstaff.

那么,您的查询可能是:

select * from user_data a
left join user_group b 
on (b.role RLIKE CONCAT('[[:<:]]',a.role,'[[:>:]]'))
Run Code Online (Sandbox Code Playgroud)

这适用b.role于以分号分隔的任何地方a.role.