 |
สอบถามเรื่องการ COUNT แบบมีเงื่อนไขเวลาเป็นช่วงเวลา PHP + MySQL |
|
 |
|
|
 |
 |
|
Code (PHP)
$sql = "SELECT node,count(case when TIMESTAMPDIFF(MINUTE,timefail,timeup) > 30 and causename='OFC ขาด/Fiber ขาด' then failid end) as cnt ";
$sql .= "FROM fail_dslam where failid <> 0 group by node having cnt <> 0 order by failid asc";
|
 |
 |
 |
 |
Date :
2013-04-26 17:10:07 |
By :
thep |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รบกวนอีกสักนิดนะครับ จากที่คุณ thep เขียนให้ผม เงื่อนไขจริงๆ คือจะนับ 'OFC ขาด/Fiber ขาด' ก็ต่อเมื่อ บันทึกเวลา(timefail) ห่างกันมากกว่า 30 นาทีจาก บันทึกเวลา(timefail) ของแถวถัดไป รบกวนแนะนำผมด้วยนะครับ
|
ประวัติการแก้ไข 2013-04-29 08:28:17
 |
 |
 |
 |
Date :
2013-04-29 08:27:19 |
By :
jaypang |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
$sql = "SELECT node,count(case when TIMESTAMPDIFF(MINUTE,timefail,(select timefail from fail_dslam where failid > a.failid and causename='OFC ขาด/Fiber ขาด' order by failid asc limit 0,1)) > 30 and causename='OFC ขาด/Fiber ขาด' then failid end) as cnt ";
$sql .= "FROM fail_dslam as a where failid <> 0 group by node having cnt <> 0 order by failid asc";
|
 |
 |
 |
 |
Date :
2013-04-29 13:34:44 |
By :
thep |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผลลัพธ์ ออกมาถูกหรือเปล่าครับ ลองนับเอง แล้วมาเทียบกับ ที่ run ด้วย คำสั่ง sql ครับ?
คำสั่งของมันก็คือ
ให้นับจำนวน failid
โดยที่เช็คนาทีของ timefail กับ timefail ของ บันทัดที่มากกว่า จำนวน 1 แถว คือ (select timefail from fail_dslam where failid > a.failid and causename='OFC ขาด/Fiber ขาด' order by failid asc limit 0,1)
จำนวนนาที มากกว่า 30 และ causename='OFC ขาด/Fiber ขาด' เท่านั้น ถ้าจริง ถึงจะนับ 1
ลองดูครับ
|
 |
 |
 |
 |
Date :
2013-04-29 15:09:38 |
By :
thep |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
นับแล้ว ผลลัพธ์ไม่ตรงครับ เป็น 1 ทุกกรณีเลยครับ

|
 |
 |
 |
 |
Date :
2013-04-29 15:29:12 |
By :
jaypang |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รอกวนขอ ตัวอย่าง Database ทีมี
failid,สาเหตุ, timefail, causename
สักประมาณ 2-3 ตัวอย่าง หน่อยดิ เอาแบบ ข้อมูล ที่ นับแล้วมากกว่า 1 ครับ
จะได้รู้ว่านับอย่างไร จะได้แก้ได้ถูก ไม่แน่ใจว่าเข้าใจตรงกันหรือเปล่า?
|
 |
 |
 |
 |
Date :
2013-04-29 16:30:57 |
By :
thep |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่มีฐานข้อมูลให้ทดสอบโค๊ดไปไม่เป็นเหมือนกันครับ
Export ข้อมูลทดสอบมาให้หน่อยสิครับ
|
 |
 |
 |
 |
Date :
2013-04-29 16:37:14 |
By :
Naizan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
http://sdrv.ms/15U8uO3
มีไฟล์ sql และ php ครับ
|
 |
 |
 |
 |
Date :
2013-04-29 19:58:10 |
By :
jaypang |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
SELECT `failid` , node, timefail, (
SELECT timefail
FROM fail_dslam
WHERE failid < a.failid
AND causename = 'OFC ขาด/Fiber ขาด'
ORDER BY failid ASC
LIMIT 0 , 1
) AS difTimeFail, TIMESTAMPDIFF(
MINUTE , timefail, (
SELECT timefail
FROM fail_dslam
WHERE failid > a.failid
AND causename = 'OFC ขาด/Fiber ขาด'
ORDER BY failid ASC
LIMIT 0 , 1
) ) AS DiffTime
FROM fail_dslam AS a
WHERE causename = 'OFC ขาด/Fiber ขาด'
ORDER BY failid ASC
โค๊ดด้านบนนี้ ผมเรียกข้อมูลทุกแถวที่ causename = 'OFC ขาด/Fiber ขาด'
และเปรียบเทียบระยะเวลาที่เกิดปัญหากับรายการก่อนหน้าให้ด้วย
ผลลัพธ์

Code (SQL)
SELECT `failid` , node, timefail, (
SELECT timefail
FROM fail_dslam
WHERE failid < a.failid
AND causename = 'OFC ขาด/Fiber ขาด'
ORDER BY failid ASC
LIMIT 0 , 1
) AS difTimeFail, TIMESTAMPDIFF(
MINUTE , timefail, (
SELECT timefail
FROM fail_dslam
WHERE failid > a.failid
AND causename = 'OFC ขาด/Fiber ขาด'
ORDER BY failid ASC
LIMIT 0 , 1
) ) AS DiffTime
FROM fail_dslam AS a
WHERE causename = 'OFC ขาด/Fiber ขาด'-- group by note
HAVING DiffTime >30
ORDER BY failid ASC
โค๊ดที่ 2 นี้จะเพิ่ม HAVING DiffTime >30 คือเอาเฉพาะรายการที่ห่างกับรายการก่อนหน้า 30 นาที
ผลลัพธ์

ถ้าใช้ mysql_num_rows ก็จะได้จำนวนทั้งหมด
แต่ถ้ามีหลายรายการก็ต้องเพิ่มคำสั่ง COUNT() และ GROUP by เข้าไปด้วย
ในส่วนนี้ผมยังไม่แน่ใจว่าจัดกลุ่มรายการตามอะไรครับ แต่คำสั่ง SQL ข้างบนนี้น่าจะใช้ได้แล้ว
|
 |
 |
 |
 |
Date :
2013-04-30 09:10:56 |
By :
Naizan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อันนี้จัดกลุ่มตามอาการที่เสีย Note ไม่แน่ใจว่าถูกรึเปล่า
SELECT `failid`, note, timefail,
(select timefail from fail_dslam where failid < a.failid AND causename='OFC ขาด/Fiber ขาด' order by failid asc limit 0,1) as difTimeFail,
TIMESTAMPDIFF(MINUTE,timefail, (select timefail from fail_dslam where failid > a.failid AND causename='OFC ขาด/Fiber ขาด' order by failid asc limit 0,1)) AS DiffTime,
count(*) AS cnt
FROM fail_dslam as a
where causename='OFC ขาด/Fiber ขาด'
GROUP by note
HAVING DiffTime > 30
ORDER by failid asc

รู้สึกว่า GROUP แบบนี้ข้อมูลจะเพี้ยนนะครับ
เพราะใช้วิธีเทียบกับ id ก่อนหน้า พอ GROUP แล้ว id ก่อนหน้าจะไม่เรียงกันครับ
คงจะต้องวนลูปนับเอาครับ
|
ประวัติการแก้ไข 2013-04-30 09:18:26 2013-04-30 10:01:00 2013-04-30 10:01:26
 |
 |
 |
 |
Date :
2013-04-30 09:16:12 |
By :
Naizan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณทุกๆ ท่านมากๆ ครับ ปลื้มใจจริงๆ ที่มีคนช่วยเหลือ 
ขอบคุณจริงๆ ครับ
|
 |
 |
 |
 |
Date :
2013-04-30 10:07:41 |
By :
jaypang |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พี่ครับ มันจะบัค
1.มี OFC ขาด/Fiber ขาด เพียงครั้งเดียว
2.มี OFC ขาด/Fiber ขาด อยู๋ท้ายสุดของข้อมูล
|
ประวัติการแก้ไข 2013-05-09 10:27:10
 |
 |
 |
 |
Date :
2013-05-02 09:34:45 |
By :
jaypang |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|