MySQL技术问询:查找指定模块下含指定用户的列名
解决方案
你的问题出在UNION ALL的子查询没有包含module_name字段,导致外层WHERE无法引用这个条件进行过滤。只需要在每个子查询里同时选出module_name,就能实现需求。
修正后的基础查询
SELECT col FROM ( SELECT "view_only" AS col, view_only AS value, module_name FROM module_access UNION ALL SELECT "limited_access", limited_access, module_name FROM module_access UNION ALL SELECT "full_access", full_access, module_name FROM module_access ) allValues WHERE value LIKE '%user4,%' AND module_name = 'accounts';
更严谨的匹配优化(避免部分用户名误匹配)
如果存在类似user44这种用户名,直接用%user4,%可能会误匹配。可以通过拼接逗号的方式,确保匹配完整的用户名:
SELECT col FROM ( SELECT "view_only" AS col, view_only AS value, module_name FROM module_access UNION ALL SELECT "limited_access", limited_access, module_name FROM module_access UNION ALL SELECT "full_access", full_access, module_name FROM module_access ) allValues WHERE CONCAT(',', value, ',') LIKE '%,user4,%' AND module_name = 'accounts';
额外建议
从表结构来看,你用逗号分隔存储多个用户的设计不符合数据库规范化原则,会导致查询效率低、维护困难。建议拆分出关联表,比如module_access_users,结构如下:
- module_name (VARCHAR)
- access_type (VARCHAR,存储view_only/limited_access/full_access)
- username (VARCHAR)
这样后续权限查询会更高效,也更容易维护数据。
内容的提问来源于stack exchange,提问作者Nimesh
相关产品推荐
相关产品推荐

