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

Posted

技术标签:

【中文标题】MySQL选择满足特定行条件的所有列名【英文标题】:MySQL select all column names where condition is met for specific row 【发布时间】:2020-09-12 09:01:50 【问题描述】:

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

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

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

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

感谢您的帮助!

【问题讨论】:

除了用户是组的成员之外,列值是否还有其他含义 - 例如用户 id = 2 第 2 列中的 3 是什么意思 每个条件的use CaseWhen语句 恕我直言,这是做你想做的事情的错误方法。 SQL 旨在处理您的关联表问题,每个组/用户组合都有一行。使用适当的索引,即使它们包含超大行,它也可以毫不费力地处理关联表。另一方面,您的设计将需要在您学习时进行噩梦般的查询。如果您需要每天添加一个新组并持续数百天怎么办? P.Salmon 不同的数字代表不同的角色,这将决定特权等 O.Jones 感谢您的建议,我认为我会这样做 【参考方案1】:

您可以使用union all 进行反透视和搜索。假设你的表的列被称为grp1grp5

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

【讨论】:

我还没有致力于任何表结构。我只是希望避免为每个用户/组组合单独一行,因为表会很大(至少 500,000 行),但如果这是最好的方法,那么我可以这样做 ? 我的想法是 mysql 是这样处理他们的用户权限的,但我猜他们不需要双向运行查询【参考方案2】:

类似的东西

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
)

【讨论】:

这样做的问题是,至少会有 100 个组,而且会一直在增加,所以这样做不切实际【参考方案3】:

您可以将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;

请注意,您的数据模型有问题。如果您正确存储了这些数据,那么解决方案会更简单。存储它的正确方法是每个用户的每个“组”和“级别”一行。

【讨论】:

以上是关于MySQL选择满足特定行条件的所有列名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL ------ 更新数据(UPDATE)(二十一)

MySQL ------ 更新数据(UPDATE)(二十一)

从具有特定列和条件的数据框中选择行(不使用列名)

MySQL - 数据查询语句

MYSQL检查所有行并满足条件

满足特定条件的列表的所有组合