2015-11-05 116 views
3

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

stu_name  maths science music art 

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

E.g.我如何获得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); 
+2

这是可怜的表设计贝基。它变成简单的加入到你在下面看到的处理它的答案的噩梦。 – Drew

回答

7

你可以这样做:

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:位或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; 
+0

谢谢你的补充。 :D你能解释一下'SubjectId - 主题表的外键'。主题表的外键是什么? – Becky

+0

@Becky它是一个外键约束,我用新设计更新了我的答案和更新后的sql fiddle演示。 –