同一查询内多SELECT不同时间条件的结果异常求助
解决多SELECT语句仅返回第一组结果的问题
嘿,我明白你遇到的麻烦了——当你在一个SQL字符串里写了多个SELECT语句时,默认的mysqli->query()只会返回第一个查询的结果集,后面的结果都被“藏”起来了,这就是为什么你只能拿到op_suma,而op_suma_a和op_suma_b没结果的原因。
下面给你两种解决方案,你可以根据自己的需求选择:
方案一:用multi_query()依次获取所有结果集
如果你坚持要保留三个独立的SELECT语句,那得改用multi_query()来执行查询,然后手动遍历每个结果集:
$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 注意三个SELECT语句之间要用分号分隔 $sql = " SELECT count(*) as op_suma from galog WHERE 你的日期条件1; SELECT count(*) as op_suma_a from galog WHERE 你的日期条件2; SELECT count(*) as op_suma_b from galog WHERE 你的日期条件3; "; // 执行多语句查询 if ($conn->multi_query($sql)) { $result_count = 0; do { // 获取当前结果集 if ($result = $conn->store_result()) { $row = $result->fetch_assoc(); // 根据结果集顺序处理对应的数据 if ($result_count === 0) { $op_suma = $row['op_suma']; echo "op_suma: " . $op_suma . "<br>"; } elseif ($result_count === 1) { $op_suma_a = $row['op_suma_a']; echo "op_suma_a: " . $op_suma_a . "<br>"; } elseif ($result_count === 2) { $op_suma_b = $row['op_suma_b']; echo "op_suma_b: " . $op_suma_b . "<br>"; } $result->free(); // 释放当前结果集资源 } $result_count++; // 切换到下一个结果集 } while ($conn->more_results() && $conn->next_result()); } $conn->close();
注意点:
- 确保三个SELECT语句之间用**分号
;**正确分隔,不然multi_query()会识别错误 - 如果某个日期条件下没有数据,
$row会返回false,建议加个判断避免报错,比如if ($row) { ... }
方案二:合并成单个查询(更高效)
其实你完全可以把三个查询合并成一个,用条件聚合的方式一次性拿到三个统计结果,这样代码更简洁,数据库查询次数也更少:
SELECT COUNT(CASE WHEN 你的日期条件1 THEN 1 END) AS op_suma, COUNT(CASE WHEN 你的日期条件2 THEN 1 END) AS op_suma_a, COUNT(CASE WHEN 你的日期条件3 THEN 1 END) AS op_suma_b FROM galog;
对应的PHP代码就简单多了,用普通的query()就行:
$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = " SELECT COUNT(CASE WHEN 你的日期条件1 THEN 1 END) AS op_suma, COUNT(CASE WHEN 你的日期条件2 THEN 1 END) AS op_suma_a, COUNT(CASE WHEN 你的日期条件3 THEN 1 END) AS op_suma_b FROM galog; "; $result = $conn->query($sql); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); $op_suma = $row['op_suma']; $op_suma_a = $row['op_suma_a']; $op_suma_b = $row['op_suma_b']; // 输出或使用这些结果 echo "op_suma: $op_suma, op_suma_a: $op_suma_a, op_suma_b: $op_suma_b"; } $conn->close();
这个方案我更推荐,因为减少了数据库交互次数,性能更好,代码也更易维护。
内容的提问来源于stack exchange,提问作者Pablo Grassi
相关产品推荐
相关产品推荐

