$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";
$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";
$sql = "SELECT node,count(case when TIMESTAMPDIFF(MINUTE,timefail,(select timefail from fail_dslam where failid > a.failid and node=a.node 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";
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
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 ข้างบนนี้น่าจะใช้ได้แล้ว
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 ก่อนหน้าจะไม่เรียงกันครับ