1. 程式人生 > >mysql聯合查詢

mysql聯合查詢

一直用yii自帶的關聯查詢,通過定義relation,然後在查詢方法中通過with建立連線,但是今天發現一個問題,因為yii1自帶的這種關聯查詢時採用左聯接left jion,這在我這裡出現了問題。
具體描述:表a模型中關聯的表有b,c表,查詢出來的總數是a表的全部資料條數,但是顯示出來的實際記錄數和條數不匹配。
我查了一下mysql左聯接的定義:先將左表資料查出,然後根據on後面的條件,將右表中凡是id與左表id相等的記錄都查出來,與匹配的左表記錄依次排成一行或多行,若無匹配的記錄,則顯示null。

mysql聯合查詢 - queen - 安然
這樣就可以看到,查詢的條數和實際記錄數是不匹配的。

===================================================================================================
在百度上找到一個解釋的蠻詳細的,現在貼出來看看

一般所說的左連線,外連線是指左外連線,右外連線。做個簡單的測試你看吧。
先說左外連線和右外連線:
[[email protected]#16-12月-11] SQL>select * from t1;

        ID NAME
---------- --------------------
         1 aaa
         2 bbb

[[email protected]#16-12月-11] SQL>select * from t2;

        ID        AGE
---------- ----------
         1         20
         3         30
左外連線:
[
[email protected]
#16-12月-11] SQL>select * from t1 left join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 2 bbb 右外連線: [[email protected]#16-12月-11] SQL>select * from t1 right join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 3 30 從上面的顯示你可以看出:左外連線是以左邊的表為基準。通俗的講,先將左邊的表全部顯示出來,然後右邊的表id與左邊表id相同的記錄就“拼接”上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。 右外連線過程正好相反。 再看內連線: [
[email protected]
#16-12月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id; ID NAME ID AGE ---------- -------------------- ---------- ---------- 1 aaa 1 20 看到沒有? 只有一條記錄。內連線就是隻取出符合過濾條件的記錄 也就是t1.id=t2.id 那麼符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外連線,是將你作為基準的表(左外連線就是左邊表為基準,右外連線就是右邊表為基準)的所有行都顯示出來。 =======================================================================================================

 好吧,以後就小心用了。

下面就是拼接sql語句的問題啦,這個只學過,但是並沒有實際用過,就模仿著我頭寫的寫,哪些地方不懂的就問了他。

$param = '';
$SQL = 'SELECT r.id,r.code,r.name,r.content,r.mobile,r.total_bonus,r.start_date,r.end_date,r.openid,r.date,u.name,u.real_name,s.bloc_id FROM (select id,code,name,content,mobile,total_bonus,start_date,end_date,openid,date from user_customers) as  r inner JOIN (select name,code,real_name from  user ) as  u ON r.code = u.code inner join (select  max(bloc_id) as bloc_id , code  from service_user_bloc  group by code desc) as  s on r.code = s.code';
$SQL .= ' WHERE 1 = 1 AND '.$this->param;//本來這裡只有一個where 1=1 來連線後面的條件即可,但是因為我要做剛開啟頁面時資料不顯示(即param=“1=2”),點選搜尋按鈕時才顯示出來(即param=“2=2”)
if (count($codes) != 0) $param .= ' AND r.code in ('.implode(",", $codes).')';
if($this->mobile!=null) $param .= " AND r.mobile = '".$this->mobile."'";
$SQL .= $param;
$SQL .= ' ORDER BY r.date ';
計算記錄條數
$countSQL = ' SELECT count(r.code) FROM (select id,code,name,content,mobile,total_bonus,start_date,end_date,openid,date from user_customers) as  r inner JOIN (select code from  user ) as  u ON r.code = u.code inner join (select code from service_user_bloc  group by code desc) as  s on r.code = s.code';
$countSQL .= '  WHERE 1 = 1 AND '.$this->param;
$countSQL .= $param;
$count= Yii::app()->db->createCommand($countSQL)->queryScalar();

這樣寫sql拼接時注意要搜尋什麼內容,則在要連線的表裡面就寫哪個欄位,還要將通過哪個欄位連線的欄位也寫上去。