รบกวนเรื่องการ Query ข้อมูลออกมาช้า จะหาวิธีตรวจสอบแบบไหนกับการ OrderBy GroupBy ของข้อมูลครับ
คำถาม 1: อ่านโค๊ดแล้ว ปวดหัว เอา statement ที่ได้มาโชว์ดีกว่าครับ
คำถาม 2: order by isMaster<>'master', job_ref desc, job_no
isMaster<>'master' ค่าที่ได้จะเป็น 0 และ 1 [ 0 ถ้าเป็นมาสเตอร์ 1 ไม่ใช่มาสเตอร์ ]
เรียงลำดับจากน้อยไปหามาก 0 มาสเตอร์จะมาก่อน
job_ref desc จะได้ค่าลำดับตัวเลขจากมากไปหาน้อย
job_no จะได้ค่าลำดับตัวเลข record จากน้อยไปหามาก
เรียงลำดับ ความสำคัญ มาสเตอร์ 0ไป1 , job_ref desc 1ไป0, job_no 0-1
ประวัติการแก้ไข 2015-10-17 05:17:07
Date :
2015-10-16 17:14:39
By :
NewbiePHP
คำถามข้อ ที่ 2
SELECT job.job_no,job.job_ref,job.branch_name,job.branch_code FROM job where job.customer_name='BAY' and job.project_code='null' order by isMaster<>'master', job_ref desc, job_no
MySql ErrorUnknown column 'isMaster' in 'order clause'
ผมใส่แล้วมัน error อะคือใน DB ผมไม่ได้เก็บอะไรไว้สำหรับตัวที่่เป็น master มันจะดูจาก job_ref อะครับ
ส่วนข้อที่1
Code (PHP)
if($_POST['Customer']!=""){
$c_name=$_POST['Customer']; //file name output
$Customer="where job.customer_name='".$_POST['Customer']."' ";
if($_POST['project_code']!=""){
//echo $p_code=$_POST['project_code']; //file name output
$project_code="and job.project_code='".$_POST['project_code']."' ";
}
else{
$p_code="All";
$project_code="";
}
}else{
$c_name="All";
$Customer="";
}
if(@$_POST['job_no']!=""){
if($Customer=="")
$job_no="where job.job_no LIKE '%".trim($_POST['job_no'])."%' ";
else
$job_no="and job.job_no LIKE '%".trim($_POST['job_no'])."%' ";
}else{
$job_no="";
}
if(isset($_POST['job_status'])){
$sub_bill="LEFT JOIN sub_bill on sub_bill.job_no=job.job_no ";
if(@$_POST['job_status']!=""){
if($Customer=="" && $job_no=="")
$job_status="where sub_bill.job_status='".$_POST['job_status']."' ";
else
$job_status="and sub_bill.job_status='".$_POST['job_status']."' ";
}else{
$job_status="";
}
}
if(isset($_POST['billing_status'])){
$payment="LEFT JOIN payment on payment.job_no=job.job_no ";
if(@$_POST['billing_status']!=""){
if($Customer=="" && $job_no=="" && $job_status=="")
$billing_status="where payment.billing_status='".$_POST['billing_status']."' ";
else
$billing_status="and payment.billing_status='".$_POST['billing_status']."' ";
}else{
$billing_status="";
}
}
if(@$_POST['date_start']!="" && $_POST['date_end']!=""){
if($Customer=="" && $job_no=="" && $job_status=="" && $billing_status=="")
$date_se="where job.date_create between '".$_POST['date_start']."' and '".$_POST['date_end']."' ";
else
$date_se="and job.date_create between '".$_POST['date_start']."' and '".$_POST['date_end']."' ";
}else{
$date_se="";
}
$query_pag_data= "SELECT job.job_no,job.job_ref, job.branch_name ,sub_bill.payment_status, payment.billing_status,payment.job_item FROM job ";
$query_pag_data.= "$sub_bill $payment "; // LEFT JOIN Table
$query_pag_data.= "$Customer $project_code $job_no $job_status $billing_status $date_se "; // Condition
//$query_pag_data.= "GROUP BY job.job_ref,job.job_no DESC ";
$query_pag_data.= "GROUP BY job.job_ref, job.job_no DESC ";
$query_pag_data.= "LIMIT $start, $per_page ";
$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());
$num_rows=mysql_num_rows($result_pag_data);
$height=$num_rows*30;
$start+=1;
จริงๆ statement มีแค่นี้ผมว่ามันก้ไม่น่าจะช้าครับแต่ยังไล่หาจุดที่ช้าไม่เจอ
Date :
2015-10-18 17:08:04
By :
wahahaboy
echo $query_pag_data ออกมาดูครับ
Date :
2015-10-18 17:12:28
By :
NewbiePHP
ลองแล้วครับมันไม่รุ้จัก
MySql ErrorUnknown column 'isMaster' in 'order clause'
คำสั่งชุดนีอะครับ
Date :
2015-10-19 14:05:07
By :
wahahaboy
มันไม่รู้จักเพราะผมยกเป็นตัวอย่าง condition ไว้เฉยๆครับ ก็แก้ให้เป็นตัวแปรที่เกี่ยวข้อเอาเองครับ
Date :
2015-10-19 14:48:44
By :
NewbiePHP
ส่วนปัญหาที่ query นานผมเจอจุดแล้วครับเกิดจาก มัน left join กัน 2 table อะครับพอจะมีคำสั่งอื่นไหมครับ เพราะผมรันใน sql ก้ช้าเหมือนกัน
Code (PHP)
$query_pag_data= "SELECT job.job_no,job.job_ref, job.branch_name ,sub_bill.payment_status, payment.billing_status,payment.job_item FROM job ";
$query_pag_data.= "$sub_bill $payment "; // LEFT JOIN Table
$query_pag_data.= "$Customer $project_code $job_no $job_status $billing_status $date_se "; // Condition
Code (SQL)
SELECT job.job_no,job.job_ref, job.branch_name ,sub_bill.payment_status, payment.billing_status,payment.job_item
FROM job
LEFT JOIN sub_bill on sub_bill.job_no=job.job_no
LEFT JOIN payment on payment.job_no=job.job_no
GROUP BY job.job_ref, job.job_no DESC LIMIT 0, 25
Date :
2015-10-19 14:49:33
By :
wahahaboy
ที่ตาราง sub_bill และ payment ได้กำหนด index ให้กับ job_no ไว้หรือเปล่าครับ
ถ้าทำไว้แล้ว
ก็ต้องถาม ต่อว่า กรณีที่ไม่ข้อมูล ใน sub_bill และ payment ให้แสดงค่าว่าง ใช่ไหมครับ
ถ้าใช่ก็หมดไอเดียครับ คงต้องรอท่านอื่นมาช่วย
แต่ถ้าไม่คือยังไงก็มีข้อมูลใน sub_bill และ payment ที่ตรงกับ Job เสมอ
ให้ใช้ inner join แทนครับ
Code (SQL)
SELECT j.job_no,j.job_ref, j.branch_name, b.payment_status, p.billing_status, p.job_item
FROM job j, sub_bill b, payment p
WHERE b.job_no=j.job_no and p.job_no=j.job_no
GROUP BY j.job_ref, j.job_no
ORDER BY j.job_ref, j.job_no DESC
LIMIT 0, 25
Date :
2015-10-19 15:21:15
By :
NewbiePHP
กำหนด index ให้กับ job_no ทั้งสองตาราางแลว้ครับ
ตาราง sub_bill จะมีเลข job_no ตรงกับตาราง job เสมอ
แต่ตาราง payment จะไม่ตรงกันกับ job ครับ กรณีที่ยังไม่มีเลข job_no ใน payment ก้ไม่ต้องขึ้น ข้อมูลของ payment_status แต่ยังคงต้องขึ้นเลข job_no อยู่
Date :
2015-10-19 16:10:25
By :
wahahaboy
ทุกเรคคอร์ดของ job จะต้องมี job_no ใน sub_bill อย่างน้อย 1 record เสมอ
Code (SQL)
SELECT j.job_no,j.job_ref, j.branch_name, b.payment_status, p.billing_status, p.job_item
FROM job j
INNER JOIN sub_bill b ON b.job_no=j.job_no
LEFT JOIN payment_status p on p.job_no=j.job_no
GROUP BY t.job_ref, t.job_no
ORDER BY t.job_ref, t.job_no DESC
ประวัติการแก้ไข 2015-10-19 17:08:45
Date :
2015-10-19 16:57:52
By :
NewbiePHP
กำหนด index ให้ตารางครับ
ตาราง sub_bill ฟิลด์ job_no
ตาราง payment ฟิลด์ job_no
ตาราง job ฟิลด์ job_no และ ฟิลด์ job_ref
Date :
2015-10-19 18:30:00
By :
NAT
Load balance : Server 04