2014-10-08 69 views
1

我有以下2個表。MySQL,根據外鍵選擇多行作爲一個

| ID | NAME | AGE | 
|----|------|-----| 
| 0 | John | 30 | 
| 1 | Nick | 35 | 
| 2 | Mike | 30 | 

| USERID |  FRUIT | 
|--------|------------| 
|  0 |  apple | 
|  0 |  orange | 
|  1 |  banana | 
|  1 |  tomato | 
|  1 |  grape | 
|  1 | watermelon | 
|  2 |  pear | 
|  2 |  cherry | 

我正在使用此查詢以獲得每個年齡爲< 34個喜歡的用戶的水果。

SELECT users.name, fruit FROM users,fruits WHERE users.id=fruits.userid AND users.age<34; 

結果:

| NAME | FRUIT | 
|------|--------| 
| John | apple | 
| John | orange | 
| Mike | pear | 
| Mike | cherry | 

sqlfiddle

有沒有辦法只有一個返回行與一個或多個列的水果每個用戶?

期望的結果:

| NAME |  FRUIT  | 
|------|---------------| 
| John | apple,orange | 
| Mike | pear,cherry | 

| NAME | FRUIT | FRUIT | 
|------|--------|--------| 
| John | apple | orange | 
| Mike | pear | cherry | 

我嘗試使用GROUP_CONCAT(),但我沒有得到結果,我預計,任何幫助將是巨大的。

提前感謝您的時間。

+0

向我們展示你的努力 – Strawberry 2014-10-08 21:08:47

+0

正如我在主文章中說,我做了一些測試使用GROUP_CONCAT ()like'SELECT users.name,group_concat(fruit)from users,fruits where users.id = fruits.userid AND users.age <34;',我也嘗試過使用'group by'(?),但我沒有認爲這是正確的軌道。 我對sql語法不太熟悉,所以我沒有太多想法,任何有關我應該搜索的方向信息的鏈接都會很棒! – Stavros 2014-10-08 21:16:52

+0

您的'JOIN'語法的注意事項:http://stackoverflow.com/questions/334201/why-isnt-sql-ansi-92-standard-better-adopted-over-ansi-89 – 2014-10-08 21:20:02

回答

2
SELECT users.name, group_concat(fruit) 
FROM users,fruits 
WHERE users.id=fruits.userid AND users.age<34 
group by user.name 
+0

謝謝,這是做到了。 我應該如何更改查詢以便從第三個表中添加數據(具有類似的形式)? 我試過'SELECT users.name,group_concat(fruit),group_concat(vegetable) FROM users,fruits,vegetables WHERE users.id = fruits.userid AND users.id = vegetables.userid AND users.age <34 group通過users.name',但它不工作,因爲我的預期。 – Stavros 2014-10-08 21:28:16

+0

試試這個:GROUP_CONCAT(CONCAT_WS('',fruit,vegetable)) – mreiterer 2014-10-08 21:36:45

+0

沒有工作好,我想我在做其他查詢時出錯。 這裏是一個小提琴 http://sqlfiddle.com/#!2/d87e3b/18 – Stavros 2014-10-08 21:46:07

0

試試這個(東西功能):

CREATE TABLE #Test(
    Name VARCHAR(100), 
    FRUIT VARCHAR(100) 
) 

INSERT INTO #Test VALUES 
    ('John', 'apple'), 
    ('John', 'orange'), 
    ('Mike', 'pear'), 
    ('Mike', 'cherry') 

SELECT Name, 
     STUFF((SELECT ', ' + FRUIT 
       FROM #Test t1 
       WHERE t1.Name = t2.Name 
       FOR XML PATH(''), TYPE).value('.','VARCHAR(MAX)'),1,2,'') AS 'Fruits' 
FROM #Test t2 
Group by Name 

Drop Table #Test 

此輸出:

Name  Fruits 
John apple, orange 
Mike pear, cherry