A-AA+then

ขอคำแนะนำ การดึงข้อมูล 2 table แล้วแสดงผลแบบ matrix

4,408


ประมาณนี้อ่ะครับ

ขอคำแนะนำ การ ดึงข้อมูล รวมถึงการแสดงผล ครับ

ขอบคุณมากครับ

4 ความคิดเห็น

ข้อมูลมีน้อยนิด...

ให้ query ข้อมูลออกมาก่อนแล้วใส่เอาไว้ใน array จากนั้นค่อยนำ array ไปจัดการแสดงผล

1 query ข้อมูลที่เป็นหัวข้อออกมาก่อน เช่น analyst, cleark เอาใส่ array ไว้
2. วนลูป array ที่ได้ ซึ่งจะเป็นข้อมูลในแนวตั้ง
3. ภายในลูป query ข้อมูล DEPT10, DEPT20.... ออกมาแสดงผลทีละรายการตามหัวข้อที่ต้องการ

แนวคิดหลักๆ คือ คงต้องประยุกต์ใช้ Array ครับ 
1

ขอบคุณสำหรับคำแนะนำครับ

คือตอนนี้ผมก็ใช้ array อยู่ครับ แต่ มันติดปัญหา อยู่นิดนึ่งครับ เหมือนกับว่า ข้อมูลที่ได้ไม่เป็นไปตามความจริงนะครับ

คลิกดูภาพประกอบ

<?
$host = "localhost";//ชื่อ database server
$user = "root"; //ชื่อผู้ใช้ databse ที่มีสิทธิ์
$pass = "xxxxxxxxxx"; //รหัสผ่าน
$dbase = "db_xxxxxxxxxx"; //ชื่อฐานข้อมูลที่จะใช้

$link = mysql_connect($host,$user,$pass) or die("Connect error : ".mysql_error());
mysql_select_db($dbase);
?>
<? $sql = "SELECT DISTINCT(tb_hazard.haz_id),tb_hazard.haz_name FROM tb_hazard, tb_ass_act WHERE ( tb_ass_act.haz_id = tb_hazard.haz_id )AND( tb_ass_act.dep_id = '15')ORDER BY tb_hazard.haz_id"; //selec ข้อมูลสำหรับแสดงผลเป็นหัวตาราง กำหนด ค่า ให้ หาเฉพาะแผนก หมายเลข 15
$rsItem = mysql_query($sql) or die("Select error : ".mysql_error()); //สร้าง result set
$item_id = array();
$item = array();
$i = 0;
while($value = mysql_fetch_assoc($rsItem)){ //วนลูปดึงข้อมูลเก็บเข้า array
$item_id[$i] = $value['haz_id']; //เก็บ id สำหรับกำหนดเงื่อนไขในการวนลูปแนวกว้าง
$item[$i] = $value['haz_name']; //เก็บตัวแปร item สำหรับแสดงผลหัว column
$i ++;
}
mysql_free_result($rsItem); //สั่งคืนค่าหน่วยความจำเพราะ $rsTopic ไม่มีการใช้งานอีกแล้ว

$sql = "SELECT DISTINCT(tb_activity.act_id),tb_activity.act_code FROM tb_activity,tb_ass_act where ( tb_activity.act_id = tb_ass_act.act_id ) AND (tb_ass_act.dep_id='15' ) ORDER BY tb_activity.act_id";
$rsValue = mysql_query($sql) or die("Select error : ".mysql_error());// SELECT ข้อมูล id,name จากตาราง tb_value โดยมีการตรวจสอบกับตาราง tb_area ซึ่งเป็น lookup table
$num_rows = mysql_num_rows($rsValue);//นับจำนวนแถวว่ามีข้อมูลหรือไม่
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XXXXXXX</title>
</head>
<body>
<?
if($num_rows>0){//ถ้ามีก็ให้แสดงผลตารางข้อมูล
?>

<table width="350" border="0" bgcolor="#000000">
<tr bgcolor="#FFFFFF">
<td align="center"><strong>พื้นที่</strong></td>
<?
for($i=0;$i<count($item_id);$i++){
?>

<td align="center"><strong><?=$item[$i]//แสดงผลหัวคอลัมน์?></strong></td>
<?
}
?>

</tr>
<?
while($ListValue = mysql_fetch_assoc($rsValue)){//วนลูปแสดงผลข้อมูลมิติที่ 1 ตามแนวตั้ง /แถว
?>

<tr bgcolor="#FFFFFF">
<td align="left">&nbsp;<?=$ListValue['act_code']//แสดงผลชื่อพื้นที่?></td>
<?
/*วนลูปแสดงผลข้อมูลมิติที่ 2 ตามแนวขวาง /คอลัมน์*/
for($i=0;$i<count($item_id);$i++){ //วนลูปให้เท่ากับจำนวน item
$sql = "SELECT tb_ass_act.haz_id,tb_ass_act.act_id FROM tb_ass_act WHERE tb_ass_act.act_id={$ListValue['act_id']} AND tb_ass_act.haz_id={$item_id[$i]}";//วนลูปหาค่าในแต่ละเชลล์ของตารางตามค่าในคีย์หลักของแถว และ คอลัมน์
$rsColValue = mysql_query($sql) or die("Select error : ".mysql_error());
$ColValue = mysql_fetch_assoc($rsColValue); //แน่ใจว่าในแต่ละเชลล์มีค่าเดียว จึงไม่ต้อวนลูป ทำ mysql_fetch_assoc เพราะถึงแม้วนลูปค่าที่ได้ก็จะมีแค่ค่าเดียวเหมือนกัน
?>

<td align="center"><?php if(number_format($ColValue['haz_id']==true)){ echo $ColValue['act_id'];}else{echo $ColValue['act_id'];} ?></td>
<?
mysql_free_result($rsColValue); //คืนค่าเมื่อไม่ได้ใช้แล้ว
}//end for
}//end while
mysql_free_result($rsValue); //คืนค่าหน่วยความจำ
?>

</tr>
</table>
<?
}
else{
echo "<p align=\"center\"><strong>ไม่มีข้อมูล</strong></p>";
}
?>

 

</body>
</html>
<?
mysql_close($link); //ปิดการติดต่อฐานข้อมูล
?>


Code ที่ผมใช้ แล้ว มันแสดง ตามรูป ซึ้ง ใน ช่อง Engine and turbine exhaust มีข้อมูล แต่ดัน ไม่ทำเครื่องหมาย X
พอจะแนะนำตรงไหนได้มั่งไหมครับ

ขอบพระคุณสำหรับความช่วยเหลือครับ

2

ปัญหาคือ ไม่รู้ทั้งโครงสร้างฐานข้อมูล ข้อมูล และ ค่ากำหนดต่างๆที่มันควรจะเป็น

คำแนะนำ..

$rsValue น่าจะผิด ใน query ครั้งที่ 2

หลักการที่ควรจะเป็น

ครั้งที่ 1 ถูกแล้ว คือ query ข้อมูลแนวตั้งออกมาก่อน ใส่ลงใน array เลย หลังจากนั้น ให้ไปวนลูปทันที

คำแนะนำที่ควรจะเป็นก็คือ ให้ใช้ array หลายมิติในการจัดการข้อมูล มากกว่าใช้ array หลายตัวเพื่อจัดการข้อมูล เช่น

<?php
  $tb_hazards[$value['haz_id']] = $value['haz_name'];
?>

เหตุผลก็เพื่อให้การจัดการและมองโค้ดได้ง่ายขึ้น และ สามารถป้องกัน id ซ้ำกันได้ด้วย

เวลาวนลูปให้ใช้ foreach

<?php
  foreach($hazards AS $haz_id => $haz_name) {
   // do some thing
  }
?>

ซึ่งแน่นอนจะทำให้การพิจารณาโค้ดง่ายขึ้น เนื่องจากสามารถสังเกตุชื่อตัวแปรได้โดยตรง และเป็นการรับประกันว่าข้อมูลจะตรงกันแน่นอน

ภายใน loop จะ query เอาข้อมูลในแนวนอน ของ id ของแถวนั้นออกมาทั้งแถว แล้วค่อยหาความสัมพันธ์เพื่อจัดการแสดงผล

ปัญหาคือตรงนี้ไม่รู้จะแนะนำยังไงเนื่องจากไม่รู้วิธีการจัดเก็บข้อมูล และ ความเป็นไปได้ของข้อมูล

ในความเป็นจริง เราสามารถ query ข้อมูลออกมาทั้งหมดได้ภายในครั้งเดียว ด้วยการ JOIN ตาราง หากจำนวนคอลัมน์มีค่าแน่นอน และ การออกแบบตารางได้ดีพอ เช่น

SELECT id,topic FROM maintable AS main
INNER JOIN col1table AS col1
ON col1.main_id = main.id
INNER JOIN col2table AS col2
ON col2.main_id = main.id
.......
INNER JOIN colntable AS coln
ON coln.main_id = main.id

มันมีหลายวิธีครับ ความยากง่ายขึ้นอยู่กับการออกแบบฐานข้อมูลและวิธีจัดเก็บด้วย
3

ครับ แก้ไข ตามที่แนะนำแล้วครับ

ได้ผลเป็นที่น่าพอใจแล้วครับ
ขอบพระคุณมากครับ

*-*

4
^