PHP脚本开发求助:检测MySQL最后10行Temperature列值是否一致并触发邮件通知
解决MySQL最后10行Temperature值一致性检测问题
首先,你的第二个SQL语句逻辑有误,导致无法得到预期结果。让我先解释问题出在哪,再给你两种可行的解决办法:
问题分析
你写的第二个查询:
SELECT Temperature, COUNT(*) as duplicates FROM AllinOne GROUP BY Temperature ORDER BY ID DESC LIMIT 10
这个语句的问题在于:
GROUP BY Temperature是对整个表中所有相同温度的行进行分组统计,而不是只针对最后10行数据ORDER BY ID DESC在分组后没有意义,因为分组后的结果集里没有单个行的ID字段,数据库无法按这个字段排序- 最终返回的是整个表中出现次数最多的前10种温度的统计数,完全不符合你“检测最后10行温度是否一致”的需求
解决方案1:用SQL直接统计(推荐)
我们可以先通过子查询获取最后10行的Temperature数据,再统计其中不同值的数量。如果不同值的数量为1,就说明所有值一致:
SELECT COUNT(DISTINCT Temperature) AS unique_temp_count FROM ( -- 先获取最后10行的Temperature SELECT Temperature FROM AllinOne ORDER BY ID DESC LIMIT 10 ) AS last_10_rows;
在PHP中处理这个结果:
$sql_check = "SELECT COUNT(DISTINCT Temperature) AS unique_temp_count FROM (SELECT Temperature FROM AllinOne ORDER BY ID DESC LIMIT 10) AS last_10_rows"; $result_check = mysqli_query($conn, $sql_check); $row_check = mysqli_fetch_assoc($result_check); if ($row_check['unique_temp_count'] === 1) { // 所有温度值一致,触发邮件发送 echo "最后10行温度全部相同,准备发送邮件!"; // 这里添加你的邮件发送代码,比如 mail(...) } else { echo "最后10行温度存在不同值,不触发邮件。"; }
解决方案2:在PHP中处理已获取的10行数据
既然你已经能成功获取最后10行数据,也可以直接在PHP代码中判断这些值是否全部相同,不用再额外查询数据库:
$sql = "SELECT ID, DayTime, Temperature FROM AllinOne ORDER BY ID DESC LIMIT 10"; $result = mysqli_query($conn, $sql); $temperatures = []; if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { $temperatures[] = $row["Temperature"]; echo "id: " . $row["ID"]. " - DayTime: " . $row["DayTime"]. " - Temperature " . $row["Temperature"]. "<br>"; } } else { echo "0 results"; } // 判断所有温度是否相同 $all_temperatures_same = false; if (!empty($temperatures)) { // 利用array_unique去重后,若长度为1则说明全部相同 $all_temperatures_same = count(array_unique($temperatures)) === 1; } if ($all_temperatures_same) { // 触发邮件发送功能 echo "所有温度值一致,执行邮件发送操作!"; // 你的邮件代码写在这里 } else { echo "存在不同的温度值,不执行邮件发送。"; }
两种方法都能解决你的问题,你可以根据自己的需求选择:如果想减少PHP的代码量,用SQL统计的方法更高效;如果需要保留获取到的10行数据做其他处理,第二种方法更灵活。
内容的提问来源于stack exchange,提问作者ThP...
相关产品推荐
相关产品推荐

