Error Number 1096:数据库表GRAND TOTAL显示异常求助
解决Error 1096并实现GRAND TOTAL显示问题
首先,咱们来定位你遇到的Error Number 1096: No tables used的核心原因:在你的代码最后调用了$this->db->get(),这个方法是CodeIgniter用来快速从指定数据表取数的工具(默认需要先通过from()指定表,或者直接传表名),但你之前已经通过$this->db->query()执行了完整的自定义SQL语句,再调用get()会让CI尝试执行一个无指定表的空查询,这就触发了1096错误。
修正后的Model代码
public function total() { $totl = array(); // 合并所有逻辑为单条SQL,减少数据库交互,避免会话变量问题 $sql = ' SELECT namatoko, tgl_inpt, omz, SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(SUBDATE(CURDATE(), INTERVAL 1 YEAR)), omz, 0)) as yestr, SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(NOW()), omz, 0)) as now, (SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(NOW()), omz, 0))-SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(SUBDATE(CURDATE(), INTERVAL 1 YEAR)), omz, 0))) as selisih FROM mzharian INNER JOIN toko ON mzharian.toko=toko.idtoko WHERE YEARWEEK(tgl_inpt) = YEARWEEK(CURDATE(),1) GROUP BY idtoko UNION SELECT "TOTAL", null, null, ROUND(SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(SUBDATE(CURDATE(), INTERVAL 1 YEAR)), omz, 0))), ROUND(SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(NOW()), omz, 0))), ROUND(SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(NOW()), omz, 0))-SUM(IF(YEARWEEK(tgl_inpt) = YEARWEEK(SUBDATE(CURDATE(), INTERVAL 1 YEAR)), omz, 0))) FROM mzharian ORDER BY CASE WHEN namatoko = "TOTAL" THEN 1 ELSE 0 END, tgl_inpt ASC '; $query = $this->db->query($sql); if ($query->num_rows() > 0) { $totl = $query->result(); } return $totl; }
关键修正与优化说明:
- 移除多余的
$this->db->get():直接用$this->db->query($sql)执行完整自定义SQL,结果直接赋值给$query,彻底避免无表查询的错误。 - 合并SQL逻辑:把之前用会话变量存储的合计值,直接整合到UNION的第二个查询中,减少了3次额外的数据库请求,也避免了连接复用导致的变量值异常问题。
- 优化排序逻辑:原
ORDER BY tgl_inpt ASC会让TOTAL行(tgl_inpt为null)排在最前面,改成CASE WHEN namatoko = "TOTAL" THEN 1 ELSE 0 END可以让总计行固定显示在结果最后。 - 性能优化建议:给
YEARWEEK(tgl_inpt)表达式创建索引,能大幅提升WHERE和多个IF判断的查询效率;如果omz字段可能为null,建议用COALESCE(omz, 0)包裹,让计算更严谨。
内容的提问来源于stack exchange,提问作者eleonora anggi
相关产品推荐
相关产品推荐

