2014-12-13 47 views
-1

列我有一個表,它看起來像這樣

轉換行作爲在MySQL

RegNo------------Subject-----------------Eligibility 
112109-----------CMIS 1113---------------Eligible 
112109-----------ELTN 1113---------------Not Eligible 
112109-----------IMGT 1113---------------Eligible 
112108-----------CMIS 1113---------------Eligible 
112108-----------ELTN 1113---------------Not Eligible 
112108-----------IMGT 1113---------------Not Eligible 
112107-----------CMIS 1113---------------Eligible 

我想上面的表格轉換如下

RegNo------------CMIS 1113-----------------ELTN 1113--------------IMGT 1113 
112109-----------Eligible------------------Not Eligible-----------Eligible 
112108-----------Eligible------------------Not Eligible-----------Not Eligible 
112107-----------Eligible------------------Null-------------------Null 

我不知道這是否是否有可能。所以如果有人能幫助我,將會非常感激。謝謝

+0

你不能獲得與可變列計數數據結果,但它可能的,如果設置主題值是預定義... – 2014-12-13 17:40:19

+0

Ok.if那該怎麼辦呢? – Punuth 2014-12-13 17:41:45

+0

在這種情況下可能有多少個「主題」是否僅限於少數? – 2014-12-13 17:41:52

回答

1

你不能得到數據結果可變列數。
然而,它可能的,如果設置主題值是預定義...
你可以建立查詢喜歡這裏:

$subjects = array(
    'CMIS 1113', 
    'ELTN 1113', 
    'IMGT 1113' 
); 

$joins = array(); 
$fields = array(); 
for ($i=0; $i<count($subjects); $i++) { 
    $joins[] = "LEFT JOIN Table t{$i} ON t0.ReqNo=t{$i}.ReqNo AND Subject = '{$subjects[$i]}'"; 
    $fields[] = "t{$i}.Eligibility as `{$subjects[$i]}`"; 
} 
$joins = implode(' ', $joins); 
$fields = implode(',', $fields); 

$sql = "SELECT t.ReqNo, $fields 
From table t 
$joins 
Group by t.ReqNo 
"; 

結果查詢將是這樣的:

SELECT t.ReqNo, t0.Eligibility as `CMIS 1113` /*similar fields*/ 
From table t 
LEFT JOIN table t0 ON t.ReqNo = t0.ReqNo AND t0.Subject = 'CMIS 1113' 
/*similar joins*/ 
Group by t.ReqNo 
+0

這是一個MySql查詢嗎? – Punuth 2014-12-13 17:57:49

+0

有趣的替代純動態sql – Mihai 2014-12-13 17:59:47

+0

它使用PHP構建MySQL查詢。 – 2014-12-13 18:00:14

2

對於一組已知來自行的值需要被顯示爲可以使用以下技術完成的列。

SELECT 
    RegNo, 
    max(if(Subject = 'CMIS 1113', Eligibility, NULL)) as `CMIS 1113`, 
    max(if(Subject = 'ELTN 1113', Eligibility, NULL)) as `ELTN 1113`, 
    max(if(Subject = 'IMGT 1113', Eligibility, NULL)) as `IMGT 1113` 
from table_name 
group by RegNo