2014-10-08 35 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