資料庫的left join語法

在2003-09-28小弟在PHP5網管實驗室寫過一小篇left join的用法
全文如下:

目的:不管有沒有電話資料全部列出

表A:全部姓名(id,name)
表B:部分有電話的人與電話資料(name,tel)

left join on 可以將兩個表加在一起

語法如下
SELECT 表A.id,表A.name,表B.tel
FROM 表A left join 表B
on 表A.name=表B.name order by id

有網友回應上面那個語法,沒有太大的用途,其回應如下:

那我如果想成以下的話,是否出現的是一樣的東西呢?

SELECT 表A.id,表A.name,表B.tel
FROM 表A ,表B
where 表A.name=表B.name order by id

若這兩者的答案是一樣的話,LEFT join又有何用呢?

我的回應如下:

問的好,您賺到了!(見下文)

看似一樣,但使用時就未必
表A:全部姓名(id,name)
表B:部分有電話的人與電話資料(name,tel)

假設表A有100筆,表B僅50筆

當您想要一次列出100筆連帶列出電話的資料時
用您的方式僅能列出50筆,別人就會問您,其他的人那裡去了。
所以您得下兩次的sql語法,而用我的方式卻僅列一次。
這樣子,應理解差別的地方了吧!

當然一般使用上不會是像例子那麼簡單,通常會加入where 子句


SELECT 表A.id,表A.name,表B.tel
FROM 表A left join 表B
on 表A.name=表B.name
where 表A.???='' and 表B.???=''
order by ???


今天新的狀況:

表A:主項目記錄m_id,title
表B:子項目記錄 id ,m_id,.....
表C:參加入員記錄 id,m_id,....

當我想要列出『表A:主項目及相關的子項目統計及人員統計』這時我要如何下資料語法呢?

這個語法與上述不同的是join進來兩個表

select  表A.* , count(表B.id) as n1 ,count(表C.id) as n2
from 表A 
left join 表B  on 表A.m_id=表B.m_id
left join 表C  on 表A.m_id=表C.m_id
group by 表A.m_id

但列出來的結果出乎我的意料之外,它竟然會跑出 表B* 表C的數量結果!
經過資料的找尋,原來要加上唯一的語法。
正確的語法如下:

select  表A.* , count(DISTINCT表B.id)) as n1 ,count(DISTINCT(表C.id)) as n2
from 表A 
left join 表B  on 表A.m_id=表B.m_id
left join 表C  on 表A.m_id=表C.m_id
group by 表A.m_id


不過這樣的語法一下,足足跑了5秒多鐘
這樣的效能還不如分兩次來查詢來做。


標籤: sql
評論: 3 | 引用: 0 | 閱讀: 22560
  • 1 
鹿港人 [ 2012-10-26 22:30 網址 | 回覆 | 編輯/刪除 ]
請問你知道如何用complete set的五個運算子兜出left outer join這個運算子嗎?
HUWEIAIGO [ 2009-06-19 14:53 網址 | 回覆 | 編輯/刪除 ]
找了半天的资料找到你这里终于解决我的问题了,您的DISTINCT帮我解决了这个问题,感谢
疯feng [ 2008-08-15 09:03 | 回覆 | 編輯/刪除 ]
谢了,看了你的网页受益匪浅
  • 1 
發表評論
暱 稱(*): 密 碼:
網 址: E - mail:
驗證碼(*): 驗證碼圖片 選 項:
頭 像:
內 容(*):
  • 粗體
  • 斜體
  • 底線
  • 插入圖片
  • 超連結
  • 電子郵件
  • 插入引用