如何在SQL查询中执行此操作?

时间:2011-08-19 10:32:07

标签: mysql sql join string-aggregation

Table: A                  Table: B                 Table: C
------------            ----------------          -------------
P_id | G_id              P_id  |  Name            G_id | Title
------------            ----------------          -------------
 1   |  1                 1    | john              1   | php
 2   |  1                 2    | jack              2   | sql
 3   |  2                 3    | sam

现在我正在查询:

Select B.name, C.title
from B inner join A on...
inner join c on...

如果我们在这里输入john,那么它将显示如下:

john php.

但我希望将它显示为:

john jack  php.   

因为约翰和杰克的G_id是相同的 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

伪代码(类似于mysql):

SELECT B.name, C.title 
FROM B
INNER JOIN A ON A.P_id = B.P_id
INNER JOIN C ON A.G_id = C.G_id
WHERE A.G_id = (
                 SELECT A.G_id 
                 FROM B
                 INNER JOIN A ON A.P_id = B.P_id
                 WHERE B.Name LIKE '%John%' LIMIT 1
               );

修改

这会使您的结果按名称搜索,使用{b> Everton Agner 建议的GROUP_CONCAT和GROUP BY来正确格式化结果。

答案 1 :(得分:1)

您需要聚合函数才能使用此类分组。我不熟悉MySQL,但是使用group_concat()函数尝试非常类似的东西:

select
    group_concat(b.Name),
    c.Title
from
    A a
    join B b on b.P_id = a.P_id
    join C c on c.G_id = a.G_id
group by
    c.Title

希望它能告诉你“约翰,杰克”

在此处查看有关聚合函数的文档:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

- 编辑

刚试过它,它给了我以下输出:

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
| sam                  | sql   |
+----------------------+-------+

我希望你想要的是:)

- 编辑(最后一个)

现在我想我明白了你想要的东西,只需添加having group_concat(b.Name) like '%john%',它就会只给你john所包含的群组...更好的选择是array contains功能,但我还没找到。

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
+----------------------+-------+
相关问题