2011-05-30 71 views
3

不過我的包裹圍繞SQL和PHP的頭,但希望有人能夠幫助這一點:PHP和MySQL多到許多問題

我有以下表格:

1.

user table 
- id 
- name 
- email 

2.

user_group table 
- user_id 
- group_id 

3.

group table 
- id 
- group_name 

用戶表和組表之間存在多對多的關係。現在我所要做的建立瀏覽用戶頁面,其中列出了系統中所有的用戶,他們屬於羣體一起,所以頁面看起來是這樣的:

Name: John Doe 
Groups: football, tennis, swimming 

Name: Jane Doe 
Groups: hockey, basketball 

Name: Jim Doe 
Groups: hockey, football, rugby 

等等,等等

要做到這一點,我有以下SQL:

SELECT `user`.name, `group`.name 
FROM `user`, `user_group`, `group` 
WHERE `user`.id = `user_group`.user_id 
    AND `group`.id = `user_group`.group_id 
GROUP BY `user`.id, `group`.id 

如下返回結果:

1. John Doe | football 
2. John Doe | tennis 
3. John Doe | swimming 
4. Jane Doe | hockey 
5. Jane Doe | basketball 
etc. etc. 

正如您所看到的,返回的結果需要進行處理以產生前面顯示的以逗號分隔的組。

是否有一種簡單的方法讓頁面顯示組,使它們在MySQL中的每個用戶都以逗號分隔的列表中?或者是否必須編寫PHP代碼來循環查找重複ID並在頁面上生成以逗號分隔的組列表的結果?或者我在做我的做法完全錯誤的東西?

非常感謝。

+0

我不能想辦法做到這一點在一個查詢atm,但我會首先獲取所有用戶的列表,然後遍歷該列表選擇group.name WHERE user.name = $ username – rcapote 2011-05-30 08:20:53

回答

2

有幾個選項(按我的個人喜好排序)。

  1. 不要按用戶標識進行分組,並迭代搜索結果並使用用戶標識作爲關鍵字創建多維數組。
  2. 使用GROUP_CONCAT,這並不美觀。
  3. 使用單獨的查詢來選擇所有組+用戶,並迭代創建多維數組。
+0

在您看來,什麼是錯誤的wi第GROUP_CONCAT? – user775925 2011-05-30 08:36:23

+0

超過最大長度時,它可能會有無法預料的問題,並且當您只需要更多名稱時,就不會收到分組信息,並且無論如何都需要您自己映射它們。 – 2011-05-30 08:48:04

2

你很幸運。 MySQL有一個非常方便的聚合運算符group_concat,它允許您將分組結果合併爲一行。在你的情況下,它會去是這樣的:

SELECT 
    `user`.name, 
    GROUP_CONCAT(`group`.group_name) 
FROM `user` 
INNER JOIN `user_group` ON (`user_group`.user_id = `user`.user_id) 
INNER JOIN `group` ON (`group`.group_id = `user_group`.group_id) 
GROUP BY `user`.name 
2

這是沒有意義的有group_id在用戶表,如果它是許多一對多和你已經有了一個連接表。

從PHP我猜你使用MySQL,所以你可以在像這樣的情況下使用GROUP_CONCAT。

無論如何,你正在查詢的是一個層次結構,它不能平鋪到一張表上,所以你總是需要做一些PHP編碼來恢復層次結構。

+0

謝謝,額外的group_id字段是我的一個錯字。現在刪除。 – user775925 2011-05-30 08:45:44

2

嘗試GROUP_CONCATINNER JOIN

SELECT user.name, GROUP_CONCAT(group.name) FROM user 
INNER JOIN user_group ON user.id = user_group.user_id 
INNER JOIN group ON group.id = user_group.group_id 
GROUP BY user.name 
0

這將匹配你的表結構:)

SELECT `user`.name, GROUP_CONCAT( `group`.group_name) 
FROM `user` 
INNER JOIN `user_group` ON ( `user_group`.user_id = `user`.id) 
INNER JOIN `group` ON ( `group`.id = `user_group`.group_id) 
GROUP BY `user`.name 

HTH :)