一对多SQL SELECT成单行

时间:2012-07-11 20:52:40

标签: mysql pivot

我有两个表中的数据。

第一个表有一个名为PKID的主键

PKID  DATA
0    myData0
1    myData1
2    myData2

第二个表将表1中的PKID列作为外键

PKID_FROM_TABLE_1  U_DATA
       0          unique0
       0          unique1        
       0          unique2
       1          unique3
       1          unique4
       1          unique5
       2          unique6
       2          unique7
       2          unique8

我现在正在制作的基本SELECT语句是

SELECT a.PKID, a.DATA, b.U_DATA
FROM table1 as a
INNER JOIN table2 as b
ON a.PKID = b.PKID_FROM_TABLE_1

这会生成如下表格:

PKID   DATA     U_DATA
 0   myData0    unique0
 0   myData0    unique1
 0   myData0    unique2
 1   myData1    unique3
 1   myData1    unique4
 1   myData1    unique5
 2   myData2    unique6
 2   myData2    unique7
 2   myData2    unique8

我想要的是下表:

PKID   DATA    U_DATA1    U_DATA2    U_DATA3
 0     myData0 unique0    unidque1   unique2
 1     myData1 unique3    unidque4   unique5
 2     myData2 unique6    unidque7   unique8

如果有帮助,每个PKID将在表2中正好有3个条目。

这样的事情在MySQL中是否可能?

2 个答案:

答案 0 :(得分:17)

这是获得结果的一种方法。

此方法使用相关子查询。每个子查询使用ORDER BY子句对table2中的相关行进行排序,并使用LIMIT子句检索第1行,第2行和第3行。

SELECT a.PKID
     , a.DATA
     , (SELECT b1.U_DATA FROM table2 b1
         WHERE b1.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b1.U_DATA LIMIT 0,1
       ) AS U_DATA1
     , (SELECT b2.U_DATA FROM table2 b2
         WHERE b2.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b2.U_DATA LIMIT 1,1
       ) AS U_DATA2
     , (SELECT b3.U_DATA FROM table2 b3
         WHERE b3.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b3.U_DATA LIMIT 2,1
       ) AS U_DATA3
  FROM table1 a
 ORDER BY a.PKID  

后续

@ gliese581g指出这种方法可能存在性能问题,外部查询返回大量行,因为SELECT列表中的每个子查询都会为外部查询中返回的每一行执行。

不言而喻,这种方法需要一个索引:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

- 或者,至少 -

ON table2 (PKID_FROM_TABLE_1)

如果定义了外键,则后一个索引可能已经存在。前一个索引将允许从索引页面(“使用索引”)完全满足查询,而无需排序操作(“使用filesort”)。

@ glies581g非常正确地指出,这种方法的表现在“大型”集合上可能会出现问题。

答案 1 :(得分:5)

根据您的MySQL版本,您可以查看GROUP_CONCAT