2015-11-05 131 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演示。 –