首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择特定行满足条件的所有列名

问MySQL选择特定行满足条件的所有列名
EN

Stack Overflow用户
提问于 2020-09-12 17:01:51
回答 3查看 61关注 0票数 1

我有一个将用户链接到组的表,其设置如下:

​

我想知道是否有一种方法可以选择满足特定条件的所有groupID(列名)。

例如,如果我想查找用户2的级别大于0的所有组,它将返回(1,2,4)

还值得注意的是,它不能手动完成,因为大约有5000行和120列

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-12 17:17:04

您可以使用union all取消透视和搜索。假设表中的列名为grp1到grp5

代码语言:javascript
复制
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

代码语言:javascript
复制
userid    grp      val
     1      1        3
     1      2        2
     1      3        2
     1      4        2
     1      5        0
     ...

然后,查询就像这样简单:

代码语言:javascript
复制
select grp from user_groups where userid = 2 and val > 0
票数 1
EN

Stack Overflow用户

发布于 2020-09-12 17:07:22

像这样的东西

代码语言:javascript
复制
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
)
票数 0
EN

Stack Overflow用户

发布于 2020-09-12 19:10:44

您可以在case表达式中使用concat_ws():

代码语言:javascript
复制
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;

请注意,我们的数据模型有一个问题。如果您正确地存储了这些数据,那么解决方案将会更简单。正确的存储方式应该是每个用户的"group“和"level”占一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63858648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档