mysql報錯:Column 'id' in field list is ambiguous,以及tp的三表聯合查詢語句,列印sql等
阿新 • • 發佈:2019-01-02
一、報錯資訊
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