Mysql 如何汇总多个详细信息行';将列转换为单个列?

Mysql 如何汇总多个详细信息行';将列转换为单个列?,mysql,sql,join,Mysql,Sql,Join,我有两张桌子: table_a: ID | NAME =============== 1 | DAN 2 | RON 3 | JANE table_b: ID | TEXT =============== 2 | APPLE 2 | BANANA 2 | COFFEE 我需要得到ID 2的结果。 我在想,即使我从table_b中得到一个包含ID 2文本值的字符串也会

我有两张桌子:

table_a:

ID    |    NAME    
===============
1     |    DAN
2     |    RON
3     |    JANE

table_b:

ID    |    TEXT    
===============
2     |    APPLE
2     |    BANANA
2     |    COFFEE
我需要得到ID 2的结果。 我在想,即使我从
table_b
中得到一个包含ID 2文本值的字符串也会很好,例如:

ID     |    NAME    |    TEXT
=============================
2      |    RON     | APPLE,BANANA,COFFEE
这可能吗

SELECT
    A.*,GROUP_CONCAT(B.`TEXT`) `TEXT`
FROM
    table_a A INNER JOIN table_b B USING (ID)
WHERE A.ID=2;
这是一个样本

mysql> DROP TABLE IF EXISTS table_a;
Query OK, 0 rows affected (0.03 sec)

mysql> DROP TABLE IF EXISTS table_b;
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE table_a
    -> (ID int not null auto_increment,
    -> NAME VARCHAR(20),primary key (ID));
Query OK, 0 rows affected (0.13 sec)

mysql> CREATE TABLE table_b
    -> (ID int not null,`TEXT` TEXT,key (ID));
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO table_a (NAME) VALUES ('DAN'),('RON'),('JANE');
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO table_b (ID,`TEXT`) VALUES
    -> (2,'APPLE'),(2,'BANANA'),(2,'COFFEE');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT A.*,GROUP_CONCAT(B.`TEXT`) `TEXT`
    -> FROM table_a A INNER JOIN table_b B USING (ID) WHERE A.ID=2;
+----+------+---------------------+
| ID | NAME | TEXT                |
+----+------+---------------------+
|  2 | RON  | APPLE,BANANA,COFFEE |
+----+------+---------------------+
1 row in set (0.00 sec)
试试看

要获取表_a中的所有可用值以及可以从表_b中分组的任何值,请执行以下操作:

SELECT
    A.*,IFNULL(GROUP_CONCAT(B.`TEXT`),'') `TEXT`
FROM
    table_a A LEFT JOIN table_b B USING (ID)
GROUP BY A.ID
以下是该示例:

mysql> use test
Database changed
mysql> DROP TABLE IF EXISTS table_a;
Query OK, 0 rows affected (0.03 sec)

mysql> DROP TABLE IF EXISTS table_b;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE table_a (ID int not null auto_increment,NAME VARCHAR(20),primary key (ID));
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE table_b (ID int not null,`TEXT` TEXT,key (ID));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO table_a (NAME) VALUES ('DAN'),('RON'),('JANE');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO table_b (ID,`TEXT`) VALUES (2,'APPLE'),(2,'BANANA'),(2,'COFFEE');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT A.*,IFNULL(GROUP_CONCAT(B.`TEXT`),'') `TEXT`
    -> FROM table_a A LEFT JOIN table_b B USING (ID) GROUP BY A.ID;
+----+------+---------------------+
| ID | NAME | TEXT                |
+----+------+---------------------+
|  1 | DAN  |                     |
|  2 | RON  | APPLE,BANANA,COFFEE |
|  3 | JANE |                     |
+----+------+---------------------+
3 rows in set (0.00 sec)

mysql>
您可以使用MySQL中的函数合并相关表的结果:

select
  a.id,
  a.name,
  group_concat(b.text) text
from
  table_a a
join
  table_b b on a.id = b.id
group by a.id
样本输出:

| ID | NAME |         TEXT         |
------------------------------------
|  2 |  RON |  APPLE,BANANA,COFFEE |

演示:

您只需使用
GROUP\u CONCAT

SELECT  a.ID, a.Name, GROUP_CONCAT(b.text) textList
FROM    table_a a
        INNER JOIN table_b b
            ON a.ID = b.ID
-- WHERE ...if you want extra condition.
GROUP BY a.ID, a.Name

这是针对MS SQL Server的,但MySQL是否也有类似的功能?在PostgreSQL中,您使用
array\u agg
函数:这仅在您只想获取一个ID时适用。但如果您想要两个或更多ID,这将给您带来无效的结果,因为您没有按
ID
对记录进行
分组。谢谢@rolandmysqldba!-每个人,这个家伙都是伪装的天使。这个查询只适用于这种情况,并且受到限制。但是,如果您在另一个表上有匹配的其他ID,这个查询将失败,因为您没有指定group by子句。请看这里: