2011-08-04 23 views
3

我有以下表格:SQL左連接 - 同樣的結果多次

用戶

id |命名

信息

ID | info | user_id

(USER_ID從表信息是外鍵=>從表連接到ID 用戶

這可能是該用戶將在信息表中的許多項(同USER_ID在許多行)。

現在我想獲取數據和這樣的顯示出來:

username: 

... info .... 

例子:

admin: 

aaa 

bbb 

ccc 

someuser: 

ddd 

eee 

fff 

所以我使用LEFT JOIN這樣的:

SELECT users.name, info.info 
FROM users 
LEFT JOIN info 
ON users.id = info.user_id 

但我得到如下:

admin: 

aaa 

admin: 

bbb 

admin: 

ccc 

我怎樣才能顯示用戶名只有一次?我試過SELECT後使用DISTINCT關鍵字,但它沒有幫助。同時我在php代碼本身內部解決了這個問題,但是有什麼方法可以解決這個問題嗎?

+1

您試圖查詢和輸出嵌套結構(用戶信息的父母)直接從MySQL。關係數據庫並沒有真的被削減。在前端代碼中執行格式化可以。 – Jacob

+0

DISTINCT顯示管理員3次的原因是因爲管理員有3個信息,問題是您需要哪些信息?或者你根本不需要他們中的任何一個? – ace

+0

@cularis,你的評論是完全錯誤的。在de DB中這樣做要比在php中做更快更簡單。 – Johan

回答

4
SELECT users.name, GROUP_CONCAT(info.info SEPARATOR 'whateveryouwant') as info 
FROM users 
INNER JOIN info ON (users.id = info.user_id) 
GROUP BY users.name 

默認情況下group_concat使用,作爲分隔符,但你可以改變,如果需要的。

鏈接:
http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

+2

不要忘記:結果被截斷爲由默認值爲1024的group_concat_max_len系統變量給出的最大長度。儘管返回值的有效最大長度受到約束,但該值可以設置得更高由max_allowed_pa​​cket的值決定。 – RiaD

+1

非常感謝我的朋友!正是我需要的。 – heradcvb

+1

@RiaD,感謝您的評論,好點。 – Johan

1
$lastname=""; 
$res=mysql_query($yourQuery); 
while($row=mysql_fetch_assoc($res)){ 
    if($row['name']!=$lastname){ 
     $lastname=$row['name']; 
     print $lastname.':'; // first time print it 
    } 
    print $row['info']; 
} 
+1

我知道。正如我所說,我把它固定在php代碼本身。我也是這樣做的。但我想知道是否有更簡單的方法。只需通過編輯sql。 – heradcvb