รบกวนสอบถามการตัดค่า NULL และการเรียงลำดับ select SQL ค่ะ

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา รบกวนสอบถามการตัดค่า NULL และการเรียงลำดับ select SQL ค่ะ

รบกวนสอบถามการตัดค่า NULL และการเรียงลำดับ select SQL ค่ะ
ต้องการทราบว่าหาก ไม่ต้องการแสดงข้อมูลที่มีค่า NULL ใน impactlevel หรือ problevel ต้องใส่ not null ยังไงคะ 
และถ้าจะเรียงลำดับจาก riskscore จะต้องทำยังไงคะเพราะว่าการเเสดงผลตารางนี้เกิดจากการเอาค่าจากสองตารางมาเเสดงค่ะ คือถ้ามีข้อมูลใน supervise ก็เอามาใส่ถ้าไม่มีให้เอาของ master มาเเทนอย่างนี้น่ะค่ะ รบกวนด้วยนะคะ 
							$strSQL="select  problevel,impactlevel,problevel*impactlevel as riskscore from risk_supervise where riskno='$info->riskno' ";
							$dbquerytmp = mysql_query($strSQL, $link);
							
						//	$infotmp=mysql_fetch_array($dbquerytmp);
							

							$cntrow1=mysql_num_rows($dbquerytmp);
							if ($cntrow1>0) {
							$infotmp=mysql_fetch_array($dbquerytmp);
							
							$worksheet->write($row,$col++,stripslashes($infotmp[impactlevel]).' X '.($infotmp[problevel]),$detail2);
							$worksheet->write($row,$col++,stripslashes($infotmp[riskscore]),$detail2);

							 }
							else {

							$strSQL="select  problevel,impactlevel,problevel*impactlevel as riskscore from risk_master where riskno='$info->riskno' ";
							$dbquerytmp = mysql_query($strSQL, $link);
							$infotmp=mysql_fetch_array($dbquerytmp);

							$worksheet->write($row,$col++,stripslashes($infotmp[impactlevel]).' X '.($infotmp[problevel]),$detail2);
							$worksheet->write($row,$col++,stripslashes($infotmp[riskscore]),$detail2);
						
							}


Sudarat2536 118.174.64.xxx 18-05-2015 10:58:37

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ


  • ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 1
ลองใช้ IS NOT NULL ดู เข่น

WHERE abc IS NOT NULL


ninenik 180.183.9.xxx 18-05-2015
 ความคิดเห็นที่ 2
ขึ้น error ค่ะ 	ที่บันทัดนี้เลยค่ะ $numrisk=mysql_num_rows($dbqueryI2);



$strSQL="select  riskno,risksubject,deptID,riskcat,problevel*impactlevel as riskscore from risk_master  where riskyear='$f_riskyear' and flag='N' order by  riskscore desc ";
$dbqueryI2 = mysql_query($strSQL, $link);
$numrisk=mysql_num_rows($dbqueryI2);


sudarat2536 110.77.229.xxx 18-05-2015 11:37
 ความคิดเห็นที่ 3
ขึ้นว่า 


ninenik 180.183.9.xxx 18-05-2015
 ความคิดเห็นที่ 4
ไม่ error แล้วค่ะ เหลือ แต่ว่าจะ order by riskscore ยังไง 5555 


sudarat2536 118.174.64.xxx 18-05-2015 13:30
 ความคิดเห็นที่ 5
ORDER BY รูปแบบก็ถูกแล้วไม่ใช่หรอ 


ninenik 180.183.9.xxx 18-05-2015
 ความคิดเห็นที่ 6
คือว่า ผลมันจะออกมาเป็น report มันก็จะมี data ในส่วนของ risk_master และ risk_supervise อยู่ในอันเดียวกันเลยสงสัยค่ะว่าเวลาจะให้แสดงโดยเรียงค่า riskscore ซึ่งได้จาก problevel*impactlevel ของเเต่ละอันมา จะต้อง order by ตรงไหนค่ะ 


sudarat2536 118.174.64.xxx 18-05-2015 13:48
 ความคิดเห็นที่ 7
ใช้ตัวที่เป็น riskscore ได้เลย เช่น

SELECT *,data1*data2 as data_total  FROM tbl_a ORDER BY data_total DESC


data_total ก็เหมือนเป็นฟิลด์ที่ถูกสร้างมาแสดงชั่วคราว เราสามารถจัดเรียงจากชื่อนี้ได้เลย


ninenik 180.183.9.xxx 18-05-2015
 ความคิดเห็นที่ 8
ตริงๆแล้วใช้ได้เลยค่ะ แต่ทีนี้ผล riskscore มันมีตัวที่เอามาจาก risk_supervise ด้วย ทีนี้มันเลยเหมือนไม่เรียงตาม riskscore ค่ะ เพราะ ค่าที่เอามาเเสดงจริง มันมีมาจากสองตาราง 'งงมั๊ยคะ  พอจะมีวิธีการเรียงข้อมูลที่เอามาออกรายงานโดยไม่ใช้การ select ข้อมูลบ้างมั๊ยคะ  


sudarat2536 110.77.229.xxx 18-05-2015 14:33
 ความคิดเห็นที่ 9
แสดงว่าไปดึงข้อมูลทีละตาราง ไม่ได้ใช้ การดึงแบบ join table หรือดึงพร้อมกันสองตาราง
ตามที่เคยแนะนนำ 

http://www.ninenik.com/forum_view_1519_1.html



รูปแบบคำสั่ง sql เดียว แต่ดึงจาก 2 ตาราง

SELECT   
a.*,b.*,  
IF(ISNULL(b.impactlevel),a.impactlevel,b.impactlevel) as impactlevel,
IF(ISNULL(b.problevel),a.problevel,b.problevel) as problevel,
IF(ISNULL(b.impactlevel) AND ISNULL(b.problevel),a.impactlevel*a.problevel,b.impactlevel*b.problevel) 
as riskscore  
FROM risk_master a   
LEFT JOIN risk_supervise b  
ON a.riskno=b.riskno   
ORDER BY  riskscore DESC 


เอาคำสั่งนี้ไว้ข้างนอกสุด ไม่ต้อง query ซ้อนอีกข้างใน ตัวอย่างการใช้

<?php
$strSQL="SELECT   
a.*,b.*,  
IF(ISNULL(b.impactlevel),a.impactlevel,b.impactlevel) as impactlevel,
IF(ISNULL(b.problevel),a.problevel,b.problevel) as problevel,
IF(ISNULL(b.impactlevel) AND ISNULL(b.problevel),a.impactlevel*a.problevel,b.impactlevel*b.problevel) 
as riskscore  
FROM risk_master a   
LEFT JOIN risk_supervise b  
ON a.riskno=b.riskno   
ORDER BY  riskscore DESC ";  
$dbquery = mysql_query($strSQL, $link);  
while($rs=mysql_fetch_array($dbquery)){
	$worksheet->write($row,$col++,stripslashes($rs[impactlevel]).' X '.($rs[problevel]),$detail2);  
	$worksheet->write($row,$col++,stripslashes($rs[riskscore]),$detail2);  	
}
?>


>>>  อัพเดท >>> 18-05-2015
------------------------------------------
a.* 
ฟิลด์ของตาราง a หรือก็คือ ตาราง risk_master ทั้งหมดมาแสดง

b.* 
ฟิลด์ของตาราง b หรือก็คือ ตาราง risk_supervise ทั้งหมดมาแสดง

IF(ISNULL(b.impactlevel),a.impactlevel,b.impactlevel) as impactlevel,  
เนื่องจาก ตาราง a และ b มีการใช้ชื่อฟิลด์เหมือนกัน เราจำเป็นต้องกำหนดชื่ออ้างอิงฟิลด์ใหม่
ถ้าฟิลด์ impactlevel ของตาราง b เป้น NULL ให้ใช้ค่าของตาราง a ถ้าไม่ใช่ ให้ใช้ค่าของตาราง b 

IF(ISNULL(b.problevel),a.problevel,b.problevel) as problevel,  
เนื่องจาก ตาราง a และ b มีการใช้ชื่อฟิลด์เหมือนกัน เราจำเป็นต้องกำหนดชื่ออ้างอิงฟิลด์ใหม่
ถ้าฟิลด์ problevel ของตาราง b เป้น NULL ให้ใช้ค่าของตาราง a ถ้าไม่ใช่ ให้ใช้ค่าของตาราง b 

IF(ISNULL(b.impactlevel) AND ISNULL(b.problevel),a.impactlevel*a.problevel,b.impactlevel*b.problevel)   
as riskscore    
ถ้าฟิลด์ impactlevel และ problevel ของตาราง b เป็นค่า NULL ให้ใช้ค่าของ impactlevel และ problevel
ของราตาง a คูณกันแล้วกำหนดไว้ในชื่อ riskscore  แต่ถ้าไม่ใช่ ให้ใช้ค่าของ impactlevel และ problevel
ของราตาง b คูณกันแทน


ninenik 180.183.9.xxx 18-05-2015
 ความคิดเห็นที่ 10
ขอบคุณมากค่ะ เดี๋ยวทำดูก่อนค่ะ 


sudarat2536 110.77.229.xxx 19-05-2015 09:28
1 2 Next






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ