2012-03-24 64 views
0

我在mySQL中获得了一个数据库,让“Storage”中有一个名为“Storage_Det”的表格。这里是“Storage_Det”的内容:将列值显示为表格标题而不是原始的列表

valueid | formid | submissionid | fieldname | fieldvalue 
--------+--------+---------------+-------------+------------- 
1  | 1  | 1   | name  | Alex 
2  | 1  | 1   | position | Manager 
3  | 1  | 1   | room  | 3-10 
4  | 1  | 2   | name  | Ben 
5  | 1  | 2   | position | Accountant 
6  | 1  | 2   | room  | 2-05 
7  | 1  | 3   | name  | Denny 
8  | 1  | 3   | position | Marketing 
9  | 1  | 3   | room  | 1-03 

对于我用php显示它没有任何问题。我的问题是:我要显示我的新表视图“名”,“位置”和“房间”,这样它会显示这样的:

submissionid | name | position | room | 
-------------+--------+------------+------+ 
1   | Alex | Manager | 3-10 | 
2   | Ben | Accountant | 2-05 | 
3   | Denny | Marketing | 1-03 | 

因为我在这里是一个新手,我需要你帮帮我。请告诉我。谢谢。

好的,我想我必须在之前添加一些细节,以使我的问题足够清晰。

“表号2”不是实数表。它是根据表1中存储的数据生成的。正如您在“表号1”中看到的那样,“名称”,“位置”和“房间”中的数据将是“表号2”中的“表头”。我希望这很清楚。

+2

EHH,你为什么不只是名字,室,在原始表格中放置列? – dqhendricks 2012-03-24 18:24:48

+0

Valueid = autoincrement,formid标识数据提交的形式,submitid告诉我们同一个数字属于同一组提交。 – Yohanes 2012-03-25 02:25:59

+0

我们明白了。我们只是想知道为什么第一张桌子没有像第二张桌子那样放在首位。基本上你的数据库没有正常化,这是不好的。 – dqhendricks 2012-03-25 07:18:34

回答

0

如果你想查询给你显示的数据你怎么要求,你可以使用以下命令:

SELECT DISTINCT sd.SubmissionId 
    , sdName.FieldValue AS Name 
    , sdPosition.FieldValue AS Position 
    , sdRoom.FieldValue AS Room 
FROM Storage_Det AS sd 
LEFT JOIN Storage_Det AS sdName ON sd.SubmissionId = sdName.SubmissionId 
    AND sdName.FieldName = 'Name' 
LEFT JOIN Storage_Det AS sdPosition ON sd.SubmissionId = sdPosition.SubmissionId 
    AND sdPosition.FieldName = 'Position' 
LEFT JOIN Storage_Det AS sdRoom ON sd.SubmissionId = sdRoom.SubmissionId 
    AND sdRoom.FieldName = 'Room' 
+0

谢谢你们回答我,我拿着@Adam Wenger的答案来说明他那简单而强大的解决方案。案件结案! – Yohanes 2012-03-26 04:15:39

1

现在我更好地了解您的问题在这里是一种方法:

CREATE TEMPORARY TABLE `table2` (
`submissionid` INT NOT NULL , 
`name` VARCHAR(50) NOT NULL , 
`position` VARCHAR(50) NULL , 
`room` VARCHAR(50) NULL 
) ENGINE = MYISAM ; 

ALTER TABLE `table2` 
ADD UNIQUE (
`submissionid` , 
`name` , 
`position` , 
`room` 
); 

insert table2 (submissionid, name) select submissionid, fieldvalue from table1 where fieldname='name'; 
update table2 set position = (select fieldvalue from table1 where fieldname='position' and table1.submissionid = table2.submissionid); 
update table2 set room = (select fieldvalue from table1 where fieldname='room' and table1.submissionid = table2.submissionid); 


select * from table2; 
+0

感谢您的回复,但您误解了我的意思。表号2是从表号1生成的。它不是实数表。我的意思是,我需要操纵表号1,以便它显示“表号2”。 – Yohanes 2012-03-25 02:41:43

+0

ah ok我的确误解了,我会尽力回复 – sdjuan 2012-03-25 05:19:04

0

首先,集团所有的数据一定submissionid像这样(假设非常基本的mysql API):

$sIdGroup = array(); 
while ($row = mysql_fetch_assoc($result)) 
{ 
    if (!isset($sIdGroup[ $row[ "submissionid" ] ])) 
    { 
     $sIdGroup[ $row[ "submissionid" ] ] = array(); 
    } 

    $sIdGroup[ $row[ "submissionid" ] ][ $row[ "fieldname" ] ] = $row[ "fieldvalue" ]; // Save the value for the current field 
} 

现在显示,第一列名:

echo('<table><tr><td>submissionid</td>'); 

// Get the first row in $sIdGroup (i'm assuming 1 is not always the first index) 

reset($sIdGroup); 
$firstSubmissionId = key($sIdGroup); 

foreach ($sIdGroup[ $firstSubmissionId ] as $key => $dummy) 
{ 
    echo("<td>$key</td>"); 
} 

现在数据:

echo('</tr>'); 

foreach ($sIdGroup as $submissionId => $data) 
{ 
    echo("<tr><td>$submissionId</td>"); 
    foreach ($data as $key => $value) 
    { 
     echo("<td>$value</td>"); 
    } 
    echo('</tr>'); 
} 

echo('</table>'); 
相关问题