【问题标题】:Get column name by student name按学生姓名获取列名
【发布时间】:2017-12-04 21:38:58
【问题描述】:

是否可以在查询中获取表的列名?我正在使用 PDO

 stu_name      maths   science   music  art  

 John          done      done      -    done   
 Max             -       done      -    done   
 Peter          -        done      -     -   

例如如何获取未完成 John 的主题(-)? music 应该是结果。

这就是我现在的位置。我不知道该怎么做。

$sql = "SELECT * FROM coll_student WHERE stu_name = :name AND ?? = '-' LIMIT 1";
$stat = $connect->prepare($sql);
$stat->execute(array(':name'=>"John"));
$output = $stat->fetchAll(PDO::FETCH_COLUMN);

【问题讨论】:

  • 这是糟糕的餐桌设计贝基。它将简单的连接变成你在下面看到的处理它的噩梦。

标签: php mysql pdo


【解决方案1】:

你可以这样做:

SELECT
  GROUP_concat(COALESCE(CASE WHEN maths   = '-' THEN 'maths'   END, ''), 
               COALESCE(CASE WHEN science = '-' THEN 'science' END, ''), 
               COALESCE(CASE WHEN art     = '-' THEN 'art'     END, ''), 
               COALESCE(CASE WHEN music   = '-' THEN 'music'   END, '')) AS SubjectsNotDone
FROM coll_student 
WHERE stu_name = 'John'
AND ((maths    = '-') OR
      (science = '-') OR
      (art     = '-') OR
      ( music  = '-')) ;

这会给你:

| SubjectsNotDone |
|-----------------|
|           music |

但是,您的表不是normalized。您可以通过创建一个新表 Subjects 来使其更简单、更轻松、更高效:

  • SubjectId,
  • SubjectName

那么表格coll_student会是这样的:

  • stu_name,
  • SubjectId- Foreign key 到主题表:

    constraint FK_SubjectId foreign key (SubjectId) references Subjects(SubjectId)
    
  • Status: bit 或 int 作为完成与否的标志(或其他状态,如果有的话)。

那么你的查询会简单很多,像这样:

SELECT subjectname
FROM coll_student AS c
INNER JOIN Subjects AS s ON c.SubjectID = s.SubjectId
WHERE c.name = 'John' AND c.Status = 0;

【讨论】:

  • 感谢您提供的额外信息。 :D 你能解释一下SubjectId - Foreign key to the subjects table. 科目表的外键是什么吗?
  • @Becky 这是一个外键约束,我用新设计的更新的 sql fiddle 演示更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多