2016-06-08 65 views
1

有以下3個表:MySQL的 - 串聯,並加入

  1. 用戶(ID,姓名)
  2. 項目(編號,名稱)
  3. user_to_project(USER_ID,PROJECT_ID)

每用戶可以分配給多個項目,並將其存儲在user_to_project表中。我想在一個字段中用逗號分隔一個用戶名和他分配給的所有項目。我試過這樣的事情:

SELECT 
users.id AS 'ID', 
users.name AS 'Name', 
(SELECT GROUP_CONCAT (projects.name SEPARATOR ', ') 
FROM user_to_project 
INNER JOIN projects ON (projects.id = user_to_project.project_id) 
INNER JOIN users ON (users.id = user_to_project.user_id)) AS 'Projects' 
FROM users 

它讓我在每一行都分配了不是我想要的項目。如何解決這個問題?

+0

爲了讓每一個USER_ID結果行,你必須使用'GROUP BY user_id'彙總記錄。 –

+0

這不是唯一的問題,我不明白這是如何工作的,即使沒有關聯條件的外部查詢,應該拋出一個錯誤'不止一個row..' @ThorstenKettner – sagi

+0

@sagi:你說得對,這不是唯一的錯誤,但它是從什麼開始的:-)子查詢只返回一個值:所有項目在所有記錄上的共鳴。 –

回答

3

你可以用一個子查詢做到這一點,但你想要的相關條款:

SELECT u.id, u.name, 
     (SELECT GROUP_CONCAT(p.name SEPARATOR ', ') 
     FROM user_to_project tup INNER JOIN 
      projects p 
      ON p.id = utp.project_id 
     WHERE u.id = utp.user_id 
     ) as Projects 
FROM users u; 

注:

  • 使用表別名。他們使查詢更容易編寫和閱讀。
  • 不要對列別名使用單引號。只對字符串和列名稱使用單引號(並且列別名不需要任何轉義字符)。
  • 這與使用INNER JOIN的版本不同,因爲這會保留所有用戶,即使那些沒有項目的用戶。
0

我沒有看到此相關查詢的任何原因,並且您錯過了將其與外部查詢關聯的條件。你還需要一個分組。

此查詢應該給你所有的項目,每個ID

SELECT users.id, users.name , 
     GROUP_CONCAT (projects.name SEPARATOR ', ') 
FROM user_to_project 
INNER JOIN projects ON (projects.id = user_to_project.project_id) 
INNER JOIN users ON (users.id = user_to_project.user_id) 
GROUP BY users.id,users.name 

注:爲了使您的查詢工作,你需要的是從內部查詢刪除用戶表,並保持條件。

+0

誰總是投我的正確答案? – sagi

+0

這種情況對你來說是否更常發生?我也很驚訝,你得到了一個失望。沒有意義。 (有一個右括號在您的查詢太多了,順便說一句。戈登是正確的,他的回答指出錯誤類型報價正在對別名使用。但無論如何,你的回答是好!) –

+0

是的,我有錯別字:S。是的,沒有多少,但足以讓我懷疑和生氣(今天的第二個).. @ThorstenKettner – sagi