mysql报错:Column 'id' in field list is ambiguous,以及tp的三表联合查询语句,打印sql等

一、报错信息

1、报错信息

单纯的根据报错信息,意思是在联合查询中,这几个表的都有id值,mysql在执行查询中,不能分辨id是属于哪个表的。

bash 复制代码
解决方案:
1、修改表字段,不要都叫id  (这个方案不好)
2、给表起别名 (我已经起了,所以这条对我没用)

2、贴代码

scss 复制代码
//这个是三表联合查询,利用一些字段关联查询的,但一直报错
$arr = M('smj_evaluate')->alias('e')
      ->field('e.content','e.star','u.openid','o.orderid')
      ->join(' smj_userinfo  u ON e.uid = u.id')
      ->join(' smj_order o ON e.order_id = o.id')
      ->limit($p->firstRow,$p->listRows)
      ->order('e.id')
      ->where('e.status=0')
      ->select();
    var_dump($arr);

二、问题所在

上面这个问题困扰我很久。后来在一个同学的帮助下才知道问题所在。由于博主一直用的都是laravel,所以对tp3.2.3是在是陌生的不得了,在写sql的时候,不自觉的就写成了laravel的方式,实在是粗心。

1、正确代码

scss 复制代码
 $arr = M('smj_evaluate')->alias('e')
      ->field('e.content,e.star,u.openid,o.orderid')
      ->join(' smj_userinfo  u ON e.uid = u.id')
      ->join(' smj_order o ON e.order_id = o.id')
      ->limit($p->firstRow,$p->listRows)
      ->order('e.id')
      ->where('e.status=0')
      ->select();
    var_dump($arr);

大家对比一下就能发现,关键就是field括号里面的不同。在laravel中,查询某些字段都是要分开查的。但是在tp中,field中的所有字段都必须要在同一个单引号中。

三、关于打印sql语句的问题

1、利用getLastSql()方法打印

scss 复制代码
//在执行完sql之后,执行getLastSql()方法
   $sql = M('smj_evaluate')->getLastSql();
    var_dump($sql);

此方法会返回原生的sql语句。例如:

scss 复制代码
string(199) "SELECT e.content,e.star,u.openid,o.orderid FROM smj_evaluate e INNER JOIN smj_userinfo u ON e.uid = u.id INNER JOIN smj_order o ON e.order_id = o.id WHERE ( e.status=0 ) ORDER BY e.id LIMIT 0,5 "

2、如果是在model中打印sql

在model中打印,就不需要用M()实例化对象了,直接使用$this->getLastSql()即可。

3、select(false)方法打印sql

例如:

scss 复制代码
//在查询语句的select中加上false
 $arr = M('smj_evaluate')->alias('e')
      ->field('e.content,e.star,u.openid,o.orderid')
      ->join(' smj_userinfo  u ON e.uid = u.id')
      ->join(' smj_order o ON e.order_id = o.id')
      ->limit($p->firstRow,$p->listRows)
      ->order('e.id')
      ->where('e.status=0')
      ->select(false);
    var_dump($arr);

结果:

scss 复制代码
string(199) "SELECT e.content,e.star,u.openid,o.orderid FROM smj_evaluate e INNER JOIN smj_userinfo u ON e.uid = u.id INNER JOIN smj_order o ON e.order_id = o.id WHERE ( e.status=0 ) ORDER BY e.id LIMIT 0,5 "

打印sql还是很有必要掌握的一个技巧。有时候报错信息会很扯淡,这个时候每一个sql打印就让你瞬间知道到底是哪里出问题了。很赞。

多谢大牛同志的帮助。

end

相关推荐
我不会起名字3222 小时前
未接入最终读上限的参数:`websocketMaxMsgLen` 与 12.5 倍差距
后端·websocket·go·即时通讯·im·故障排查
王中阳Go4 小时前
100 件货卖出 116 件,库存停在 -16
后端·mysql·go
我不会起名字3221 天前
req.Seqs[len-1]:空切片防御缺口与 RPC 二次校验
后端·mongodb·go·即时通讯·im·故障排查
我不会起名字3222 天前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
大然Ryan3 天前
我用 Go 和 AI 做了一个 macOS 磁盘清理工具:Vole(开源)
go
我不会起名字3223 天前
seq 空洞排查:Mongo 的 51 只是预留上界,Redis CURR 才是已消耗边界
redis·后端·mongodb·go·即时通讯·im·故障排查
喵个咪4 天前
GoWind 拆解:全链 ID 类型体系——int64 定版与前端字符串化契约
前端·后端·go
喵个咪4 天前
GoWind CMS 拆解:发布审批——多级推进、逐级角色与全程留痕
前端·后端·go
喵个咪4 天前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
前端·后端·go
喵个咪4 天前
GoWind CMS 拆解:搜索三板斧——高亮、联想、同义词
后端·搜索引擎·go