如何解决MySQL选择满足特定行条件的所有列名称
我想知道是否有一种方法可以选择满足特定条件的所有groupID(列名)。
例如如果我要查找用户2的级别大于0的所有组,它将返回(1,2,4)
值得注意的是,由于大约有5000行120列,因此无法手动完成
感谢您的帮助!
解决方法
您可以取消透视和使用union all
搜索。假设表的列称为grp1
至grp5
:
select 1 as grp from t where userid = 2 and grp1 > 0
union all select 2 from t where userid = 2 and grp2 > 0
union all select 3 from t where userid = 2 and grp3 > 0
union all select 4 from t where userid = 2 and grp4 > 0
union all select 5 from t where userid = 2 and grp5 > 0
您应该考虑修复数据模型。每个用户/组元组应存储在桥表的单独行中,如下所示:
user_groups
:
userid grp val
1 1 3
1 2 2
1 3 2
1 4 2
1 5 0
...
然后,查询非常简单:
select grp from user_groups where userid = 2 and val > 0
,
类似的东西
select distinct group from (
select group1 group from t where level > 0
union
select group2 from t where level > 0
union
select group3 from t where level > 0
union
select group4 from t where level > 0
union
select group5 from t where level > 0
)
,
您可以将concat_ws()
与case
表达式一起使用:
select concat_ws(',',case when `1` > 0 then 1 end,case when `2` > 0 then 2 end,case when `3` > 0 then 3 end,case when `4` > 0 then 4 end,case when `5` > 0 then 5 end
)
from t
where userid = 2;
请注意,您对我们的数据模型有疑问。如果正确存储此数据,则解决方案将更简单。正确的存储方式是每个用户每个“组”和“级别”一行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。