1. 程式人生 > >mysql報錯:Column 'id' in field list is ambiguous,以及tp的三表聯合查詢語句,列印sql等

mysql報錯:Column 'id' in field list is ambiguous,以及tp的三表聯合查詢語句,列印sql等

一、報錯資訊

1、報錯資訊

這裡寫圖片描述

      單純的根據報錯資訊,意思是在聯合查詢中,這幾個表的都有id值,mysql在執行查詢中,不能分辨id是屬於哪個表的。

解決方案:
1、修改表字段,不要都叫id  (這個方案不好)
2、給表起別名 (我已經起了,所以這條對我沒用)

2、貼程式碼

//這個是三表聯合查詢,利用一些欄位關聯查詢的,但一直報錯
$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、正確程式碼

 $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()方法列印

//在執行完sql之後,執行getLastSql()方法
   $sql = M('smj_evaluate')->getLastSql();
    var_dump($sql);

此方法會返回原生的sql語句。例如:

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

例如:

//在查詢語句的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);

結果:

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