MySQL select 满足特定行条件的所有列名称
MySQL select all column names where condition is met for specific row
我有一个 table 将用户链接到组,其设置如下:
我想知道是否有一种方法可以select满足特定条件的所有组ID(列名)。
例如如果我想找到用户 2 级别大于 0 的所有组,它将 return (1,2,4)
还值得注意的是,它不能手动完成,因为大约有 5000 行和 120 列
感谢您的帮助!
像这样
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
)
您可以使用 union all
取消透视和搜索。假设你的 table 的列被称为 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/group 元组应存储在桥 table 中的单独行中,如下所示:
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
您可以将 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;
请注意,您对我们的数据模型有疑问。如果您正确存储这些数据,那么解决方案会更简单。正确的存储方式是每个用户的每个“组”和“级别”一行。
我有一个 table 将用户链接到组,其设置如下:
我想知道是否有一种方法可以select满足特定条件的所有组ID(列名)。
例如如果我想找到用户 2 级别大于 0 的所有组,它将 return (1,2,4)
还值得注意的是,它不能手动完成,因为大约有 5000 行和 120 列
感谢您的帮助!
像这样
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
)
您可以使用 union all
取消透视和搜索。假设你的 table 的列被称为 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/group 元组应存储在桥 table 中的单独行中,如下所示:
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
您可以将 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;
请注意,您对我们的数据模型有疑问。如果您正确存储这些数据,那么解决方案会更简单。正确的存储方式是每个用户的每个“组”和“级别”一行。