2012-09-30 71 views
2

我在我的數據庫中的兩個表大致佈局如下選擇多行數據從一個子表與父行表一起在MySQL

客戶

id | other data 
1 | data 1 
2 | data 2 
3 | data 3 
4 | data 4 

員工分配

id | clientid | employee 
1 | 1  | Fred 
2 | 1  | Jim 
3 | 3  | Peter 
4 | 4  | Fred 
5 | 4  | Peter 
6 | 4  | James 

有沒有辦法從employee表中返回客戶表中的所有員工記錄?理想情況下,我會希望行和工作人員名稱的ID,所以我不認爲我可以使用GROUP_CONCAT來收集多個列。也不保證employee表中的每個客戶端都會有條目,因此它需要爲這些客戶端返回一個空/空結果。

我已經嘗試了兩種方式來獲得這個到目前爲止在php中,這兩種方式是非常低效的在這種或那種方式。 (A)第一個是有效地建立一個新的數據庫連接到第一個數據庫連接的一半,以返回與該客戶端ID相關聯的僱員列表,但顯然導致大量的數據庫連接僅爲一個查詢。 (B)第二種方法是在代碼的開頭將整個僱員表拉入數組中,然後搜索該數組以抽出與該客戶ID相關的行,然後將該僱員姓名和行ID添加到該數組中隨着時間的推移,這將最終以一個非常大的數組立即被轉儲到php中。

是否有某種方式只用一個SQL查詢就能解決這個問題?我不是所有的大驚小怪的數據將如何走出來,因爲我相信我可以通過它在PHP在另一端進行排序,但也許沿

結果東西線

id | other data | employees 
1 | data 1  | 1,Fred;2,Jim 
2 | data 2  | 
3 | data 3  | 3,Peter 
4 | data 4  | 4,Fred;5,Peter;6,James 

如果這個問題在我道歉之前就已經問過了,但是我在上週一直在尋找一些東西,並沒有找到那麼多幫助。

回答

0
SELECT e.*, c.other_data FROM Employee e 
INNER JOIN Client c ON e.client_id = c.id 

那麼,你最終得到的是在一個查詢中抓取的兩個表中的所有信息。所以,數據將是:

 id  client_id Employee other_data 
    1    1   Fred  data 1 
    2    1   Jim   data 1 
    3    3   Peter  data 3 
    4    4   Fred  data 4 
    5    4   Peter  data 4 
    6    4   James  data 4 
+0

謝謝,但是不會返回client_id = 2行的空行。 – astropoint

+0

這是因爲沒有列出的員工使用客戶端#2 :)。如果您想了解某個特定客戶端的相關信息,只需添加一個WHERE子句即可。就像添加:WHERE e.client_id = 2將爲您提供專門的客戶端#2的員工列表。 – bms

+0

@bms,是的,你是對的。自從OP接受它以來,這是正確的答案。對不起。 –

相關問題