找到&在MYSQL给定条件下按列名排序

时间:2011-07-22 22:52:13

标签: mysql sql database

在表格中,我有以下价值:

    ID | Exercise1 | Exercise2 | Exercise3
     1 |     0     |     0     |     0
     2 |     0     |     0     |     0

当用户完成练习时,db会从“0”切换为“1”。我正在寻找一个sql查询,按用户的ID号搜索返回设置为0的最低列名称。

EX:

ID | Exercise1 | Exercise2 | Exercise3
 1 |     1     |     1     |     0

此处查询将返回exercise3,因为exercise1exercise2之前已由用户更新并完成。

我找到了 SELECT COLUMN_NAME FROM information_schema.columns
但不能把它与我正在寻找的排序放在一起,任何帮助都将深深体会。

3 个答案:

答案 0 :(得分:1)

如果您只有少数练习(例如< 5),那么您只需使用一系列嵌套的IF()语句对查询进行硬编码。

如果您有更多,那么您应该更改您的数据模型,以便每个用户/练习映射存储在一个单独的行中。

答案 1 :(得分:1)

这样的东西?

SELECT CASE
         WHEN Exercise1=0 THEN 'Exercise1'
         WHEN Exercise2=0 THEN 'Exercise2'
         WHEN Exercise3=0 THEN 'Exercise3'
         ELSE NULL
       END AS Exercise
  FROM MyTable
  WHERE ID = SomeID

答案 2 :(得分:0)

嗯......你有问题因为你的设计错了。问题是您的数据库设计受到您想象表格表示的影响。但数据库思维不同。数据库通常以这种方式设计:

StudentID | ExcerciseID | Completed
     1    |     1       |     1
     1    |     2       |     1
     1    |     3       |     0
     2    |     1       |     0
....

然后你可以这样做:

select StudentID, min(ExcerciseID) as FirstExcerciseNotCompleted
from Excercises
where Completed = 0

要查看每个学生的第一次不完整的练习,或者如果您想将下一个完成的练习设置为学生1,请执行以下操作:

update Excercises
set Completed = 1
where Student = 1 and ExcerciseID = (select min(ExcerciseID) from Excercises where StudentID = 1 and Completed = 0)