ขอคำแนะนำ การดึงข้อมูล 2 table แล้วแสดงผลแบบ matrix HomeForumขอคำแนะนำ การดึงข้อมูล 2 table แล้วแสดงผลแบบ matrix Pariwat Tokasaem ประมาณนี้อ่ะครับ ขอคำแนะนำ การ ดึงข้อมูล รวมถึงการแสดงผล ครับ ขอบคุณมากครับ กรกฎ วิริยะ ข้อมูลมีน้อยนิด... ให้ query ข้อมูลออกมาก่อนแล้วใส่เอาไว้ใน array จากนั้นค่อยนำ array ไปจัดการแสดงผล 1 query ข้อมูลที่เป็นหัวข้อออกมาก่อน เช่น analyst, cleark เอาใส่ array ไว้ 2. วนลูป array ที่ได้ ซึ่งจะเป็นข้อมูลในแนวตั้ง 3. ภายในลูป query ข้อมูล DEPT10, DEPT20.... ออกมาแสดงผลทีละรายการตามหัวข้อที่ต้องการ แนวคิดหลักๆ คือ คงต้องประยุกต์ใช้ Array ครับ Pariwat Tokasaem <p>ขอบคุณสำหรับคำแนะนำครับ คือตอนนี้ผมก็ใช้ array อยู่ครับ แต่ มันติดปัญหา อยู่นิดนึ่งครับ เหมือนกับว่า ข้อมูลที่ได้ไม่เป็นไปตามความจริงนะครับ <a target="_blank" href="http://www.thefamilyhotel.com/upimage/dat/5267d00c697cdbc7.png">คลิกดูภาพประกอบ</a> <? $host = "localhost"; //ชื่อ database server $user = "root"; //ชื่อผู้ใช้ databse ที่มีสิทธิ์ $pass = "xxxxxxxxxx"; //รหัสผ่าน $dbase = "db_xxxxxxxxxx"; //ชื่อฐานข้อมูลที่จะใช้</p> <p>$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 ไม่มีการใช้งานอีกแล้ว</p> <p>$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);//นับจำนวนแถวว่ามีข้อมูลหรือไม่ ?></p> <p><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"> <?=$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>"; } ?></p> <p> </p> <p></body> </html> <? mysql_close($link); //ปิดการติดต่อฐานข้อมูล ?> Code ที่ผมใช้ แล้ว มันแสดง ตามรูป ซึ้ง ใน ช่อง <strong>Engine and turbine exhaust มีข้อมูล แต่ดัน ไม่ทำเครื่องหมาย X </strong>พอจะแนะนำตรงไหนได้มั่งไหมครับ ขอบพระคุณสำหรับความช่วยเหลือครับ</p> กรกฎ วิริยะ ปัญหาคือ ไม่รู้ทั้งโครงสร้างฐานข้อมูล ข้อมูล และ ค่ากำหนดต่างๆที่มันควรจะเป็น คำแนะนำ.. $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 มันมีหลายวิธีครับ ความยากง่ายขึ้นอยู่กับการออกแบบฐานข้อมูลและวิธีจัดเก็บด้วย Pariwat Tokasaem ครับ แก้ไข ตามที่แนะนำแล้วครับ ได้ผลเป็นที่น่าพอใจแล้วครับ ขอบพระคุณมากครับ *-* ความคิดเห็น รายละเอียด ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 2M ส่งความคิดเห็น
ให้ query ข้อมูลออกมาก่อนแล้วใส่เอาไว้ใน array จากนั้นค่อยนำ array ไปจัดการแสดงผล
1 query ข้อมูลที่เป็นหัวข้อออกมาก่อน เช่น analyst, cleark เอาใส่ array ไว้
2. วนลูป array ที่ได้ ซึ่งจะเป็นข้อมูลในแนวตั้ง
3. ภายในลูป query ข้อมูล DEPT10, DEPT20.... ออกมาแสดงผลทีละรายการตามหัวข้อที่ต้องการ
แนวคิดหลักๆ คือ คงต้องประยุกต์ใช้ Array ครับ
ครับ แก้ไข ตามที่แนะนำแล้วครับ
ได้ผลเป็นที่น่าพอใจแล้วครับ
ขอบพระคุณมากครับ
*-*