【问题标题】:Select all columns greater than some value选择所有大于某个值的列
【发布时间】:2015-11-11 10:53:45
【问题描述】:

我是mysql新手,我有这样的结构

timestamp | Name | Total | Student1 | Student2 | Student3
20150911  | X    | 100   |       76 |       10 |       NA
20151111  | Y    | 70    |       NA |        0 |       23

现在我想用 mysql 查询在给定的 'timestamp' 处选择

  • 所有非零数字的学生列
  • 所有不适用的学生列
  • 所有为零的学生列

预期结果

  • 如果我输入“非零”查询,它应该为时间戳 20150911 提供列名称为“Student1,Student2”
  • 如果我输入“零”查询,它应该将列名称作为 () 用于时间戳 20150911
  • 如果我输入“NA”查询,它应该为时间戳 20150911 提供列名称为“Student3”

我曾尝试搜索这种混合选择,但到目前为止我还没有成功。大多数答案都集中在行选择而不是列上。

【问题讨论】:

  • 你有多少个学生栏(可变或固定)?无论如何,这看起来很糟糕,对于每个新学生,您都必须更改表格
  • @lad2025 我现在有 15 列。但是我想保持它的灵活性,这样将来我就不用担心了。但是,学生列的最大数量是 30。
  • 因为您只能在记录级别确定是否将该记录包含在结果集中,而不是基于列。请定义预期结果,以便我们帮助查询。
  • “我有这样的结构”。是的。修复它。见规范化。
  • @Shadow,我添加了预期结果。

标签: mysql sql database


【解决方案1】:

您的数据结构未标准化。但如果你想走这条路,请使用:

select sub.student
FROM (
  select t.timestamp,
    t.Name,
    t.Total,
    c.col AS student,
    case c.col
      when 'Student1' then Student1
      when 'Student2' then Student2
      when 'Student3' then Student3
      -- ...
    end as d
  from mytable t
  cross join
  (
    select 'Student1' as col
    union all select 'Student2'
    union all select 'Student3'
    -- ...
  ) c
) AS sub
WHERE sub.timestamp = '20150911'
  AND sub.d > 0;
  -- sub.d = 'NA'
  -- sub.d = 0

SqlFiddleDemo

输出:

╔══════════╗
║ student  ║
╠══════════╣
║ Student1 ║
║ Student2 ║
╚══════════╝

如果你想要逗号分隔的结果使用:

select GROUP_CONCAT(sub.student ORDER BY sub.student) AS result

SqlFiddleDemo2

输出:

╔═══════════════════╗
║       result      ║
╠═══════════════════╣
║ Student1,Student2 ║
╚═══════════════════╝

【讨论】:

  • 那么你能为这类查询推荐一些好的数据结构吗?我可以相应地改变。
  • @Dexter 这应该是新问题。对于原始问题,我提供了答案。无论如何,您应该阅读有关数据库规范化的信息
  • @Dexter。事实上,这可能是一个新问题的主题(或对现有问题的修正),但它可能会涉及两个表 - 一个包含时间戳的事件表和一个包含 event_id 和 ids 的 event_participants 表参与者们。显然,根据您的目的命名这些表。
  • @lad2025 。 . .你的第一个case 是不必要的。你可以使用c.col
  • @GordonLinoff 有趣的是我之前没有看到它并做身份CASE,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2022-01-14
  • 2015-10-15
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多