2012-12-18 33 views
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 

這甚至有可能嗎?

+0

這是MS SQL Server的太大,而p也許MySQL有類似的功能? http://codecorner.galanter.net/2009/06/25/t-sql-string-aggregate-in-sql-server/ –

+0

在PostgreSQL中,您使用'array_agg'函數:http:// stackoverflow。 com/questions/2560946/postgresql-group-concat-equivalent –

回答

2
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) 

試試看!

要查看可從表-B進行分組在表-A和任何可用的所有值:

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> 
+0

這隻適用於如果你想獲得**只有一個** ID。但如果你想要兩個或更多,這會給你**無效的**結果,因爲你沒有用'ID'對記錄進行「GROUP」分組。 –

+0

謝謝@RolandoMySQLDBA! - 所有人,這個人是變相的天使 – Ted

1

可以使用GROUP_CONCAT功能在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 | 

演示:http://www.sqlfiddle.com/#!2/e3584/9

+0

這個查詢只適用於這種情況,並且只限於這種情況,但是如果你有其他的ID已經在另一個表上匹配了,這個查詢將失敗,因爲你沒有指定group by子句。看到這裏:http://www.sqlfiddle.com/#!2/bd59f/1 –

+0

@JW .:謝謝,更新。 – mellamokb

2

你只需要使用GROUP_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