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

时间:2012-01-13 09:01:02

标签: mysql

我有一个需要进行一些更改的查询,我不知道这样做:

这是我的疑问:

select * from user_data a
left join user_group b 
on (a.role like b.role)
实际上,userdata中的角色值是(varchar)'staff'

和组中的角色值是(varchar)'staff; security; finance'

所以我得不到我期望的结果..

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

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

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

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:5)

您可以使用CONCAT

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

注意 - 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[[:<:]][[:>:]]代表字边界,阻止您与staff中的gardenstaff进行匹配。

因此,您的查询可能是:

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

这适用于b.role以分号分隔的a.role中的任何位置。