ช่วยแก้ไขคำสั่ง query array กรณีมีการเทียบข้อมูลระหว่างกันหน่อยครับ
ภาพ ฐานข้อมูล
ภาพตารางแบบฟอร์มข้อมูลที่ต้องการ
จาก code เป็นการเก็บจำนวนเดือน เพื่อ เอามาเทียบว่า ในเดือนนี้ มีข้อมูลระดับ A ทั้งหมดกี่จำนวน ระดับ B มีกี่จำนวน C,D,E,F ตามลำดับ
ในส่วนของการ query ของเดือน ข้อมูลออกแล้ว ครับ ว่าเดือนนี้ มีข้อมูลทั้งหมดเท่าไหร่ แต่ ในส่วนของระดับยังไม่ออก รบกวนหน่อยนะครับ
Code (PHP)
$year = $_POST['year'];
$month=array("1","2","3","4","5","6","7","8","9","10","11","12");
$level = array("A","B","C","D","E","F","G","H","I");
for ($i=0; $i < 12; $i++) {
$sql = "SELECT COUNT(date_in) AS dataDate, COUNT(level) AS dataLevel, COUNT(sect) AS dataSect ";
$sql .= "FROM tb_rm_manage ";
$sql .= "WHERE YEAR(date_in) = '$year' AND MONTH(date_in) = $month[$i] ";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_fetch_assoc($query);
}
Tag : PHP, MySQL, HTML/CSS
Date :
2016-04-13 16:01:16
By :
san.saleah
View :
1259
Reply :
5
Code (SQL)
select
level,
sum(month(date_in)=1) as m1,
sum(month(date_in)=2) as m2,
sum(month(date_in)=3) as m3,
...
sum(month(date_in)=12) as m12
FROM tb_rm_manage
where year(date_in)=$year
group by level
แสดงระดับ ในแต่ละเดือน
Date :
2016-04-13 19:27:31
By :
Chaidhanan
ตัวอย่าง นั้นจะได้
rec 1 level A จำนวนคนเดือน 1 จำนวนคนเดือน 2 .... 12
rec 2 level B จำนวนคนเดือน 1 จำนวนคนเดือน 2 .... 12
rec 3 level C จำนวนคนเดือน 1 จำนวนคนเดือน 2 .... 12
....
....
(month(date_in)=1 ถ้าเป็นจริง จะได้ค่า 1 เป็นเท็จจะได้ค่า 0) นำมาบวก sum() กันทุกเรคคอร์ด
(month(date_in)=2 ถ้าเป็นจริง จะได้ค่า 1 เป็นเท็จจะได้ค่า 0) นำมาบวก sum() กันทุกเรคคอร์ด
(month(date_in)=3 ถ้าเป็นจริง จะได้ค่า 1 เป็นเท็จจะได้ค่า 0) นำมาบวก sum() กันทุกเรคคอร์ด
ตัวอย่างทดสอบCode (SQL)
select lv, sum(x=1) s1, sum(x=2) s2, sum(x=3) s3
from (
select 'a' as lv, 1 as x union all
select 'a' , 2 union all
select 'b' , 1 union all
select 'b' , 2 union all
select 'b' , 1 union all
select 'a' , 2 union all
select 'b' , 2
) tb group by lv
Date :
2016-04-14 02:38:20
By :
Chaidhanan
ตอบความคิดเห็นที่ : 3 เขียนโดย : Chaidhanan เมื่อวันที่ 2016-04-14 02:38:20
รายละเอียดของการตอบ ::
อาจารย์ครับ code ตัวอย่างแรกที่อาจารย์ได้นำเสนอมานั้น ผมได้นำมาทดลอง ใน loop for ดังนี้ (ต่อจาก code เดิมของผม)
Code (PHP)
for ($i=0; $i < 12; $i++) {
$sql2 = "SELECT level, ";
$sql2 .= "SUM(month(date_in)=1) AS m1, ";
$sql2 .= "SUM(month(date_in)=2) AS m2, ";
$sql2 .= "SUM(month(date_in)=3) AS m3, ";
$sql2 .= "SUM(month(date_in)=4) AS m4, ";
$sql2 .= "SUM(month(date_in)=5) AS m5, ";
$sql2 .= "SUM(month(date_in)=6) AS m6, ";
$sql2 .= "SUM(month(date_in)=7) AS m7, ";
$sql2 .= "SUM(month(date_in)=8) AS m8, ";
$sql2 .= "SUM(month(date_in)=9) AS m9, ";
$sql2 .= "SUM(month(date_in)=10) AS m10, ";
$sql2 .= "SUM(month(date_in)=11) AS m11, ";
$sql2 .= "SUM(month(date_in)=12) AS m12 ";
$sql2 .= "FROM tb_rm_manage ";
$sql2 .= "WHERE year(date_in) = '$year' ";
$sql2 .= "GROUP BY level";
$query2 = mysql_query($sql2);
$result2 = mysql_fetch_assoc($query2) or die(mysql_error());
}
echo "<hr>เดือน1 = ".$result2['m1']."<br>";
echo "เดือน2 = ".$result2['m2']."<br>";
echo "เดือน3 = ".$result2['m3']."<br>";
echo "เดือน4 = ".$result2['m4']."<br>";
echo "เดือน5 = ".$result2['m5']."<br>";
ผลลัพธ์ที่ได้ (ระดับ) คือ
เดือน 1 = 0
เดือน 2 = 0
เดือน 3 = 1
เดือน 4 = 2
เดือน 5 = 0
เมื่อผม เข้าไปดูในฐานข้อมูลแล้ว จำนวน เดือน 3 และ 4 นั้น เป็นผลลัพธ์ของระดับ A นะครับ
ปล. code ใหม่ของอาจารย์ผมยังไม่ค่อยเข้าใจครับ
ขอบคุณครับบ
ประวัติการแก้ไข 2016-04-14 10:57:47
Date :
2016-04-14 09:48:58
By :
san.saleah
m1 = ผลลัพธ์ ของ เดือน 1
m2 = ผลลัพธ์ ของ เดือน 2
วิเคราะห์ดูครับว่าควรอยู่ใน loop ไหม
และ result ที่ได้ ไม่ได้มีแค่ record เดียว
และ 1 เรคคอร์ด จะแสดง จำนวนคน ของแต่ละเดือน ของ 1 ระดับเท่านั้น จะเป็น ระดับ A ก็จะเป็น ทั้งเรคคอร์ด
ไม่มีระดับอื่น ปน
ผลลัพธ์ ได้ครบ ขาดแต่การนำมาแสดงผล
ถ้ามองภาพไม่ออก ให้เอาโค๊ด ไปทดลองรันใน phpmyadmin จะได้เห็นว่า result ที่ได้เป็นยังไง
จะได้มา เขียนโค๊ดแสดงผลลัพธ์ตาม result ที่ได้มา
การคิวรี่หลายครั้ง ทำให้ server ทำงานหนักเพิ่มขึ้น และช้า แต่ไม่เปลือง memory
การคิวรี่ครั้งเดียวได้ผลลัพธ์ครบ เร็วแต่เปลือง memory
ก็เลือกเอาครับว่าจะเอา แบบไหน
Date :
2016-04-14 12:32:22
By :
Chaidhanan
Load balance : Server 02