我有两个表中的数据.
第一个表有一个名为PKID的主键
PKID DATA
0 myData0
1 myData1
2 myData2
Run Code Online (Sandbox Code Playgroud)
第二个表将表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
Run Code Online (Sandbox Code Playgroud)
我现在正在制作的基本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
Run Code Online (Sandbox Code Playgroud)
这会生成一个这样的表:
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
Run Code Online (Sandbox Code Playgroud)
我想要的是下表:
PKID DATA U_DATA1 U_DATA2 U_DATA3
0 myData0 unique0 unidque1 unique2
1 myData1 unique3 unidque4 unique5
2 myData2 unique6 unidque7 unique8
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,每个PKID将在table2中正好有3个条目.
这样的事情在MySQL可能吗?
spe*_*593 19
这是获得结果的一种方法.
此方法使用相关子查询.每个子查询使用一个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
Run Code Online (Sandbox Code Playgroud)
跟进
@ gliese581g指出这种方法可能存在性能问题,外部查询返回大量行,因为SELECT列表中的每个子查询都会为外部查询中返回的每一行执行.
不言而喻,这种方法需要一个索引:
ON table2 (PKID_FROM_TABLE_1, U_DATA)
Run Code Online (Sandbox Code Playgroud)
- 或者,至少 -
ON table2 (PKID_FROM_TABLE_1)
Run Code Online (Sandbox Code Playgroud)
如果定义了外键,则后一个索引可能已经存在.前一个索引将允许从索引页面("使用索引")完全满足查询,而无需排序操作("使用filesort").
@ glies581g非常正确地指出这种方法的性能在"大型"集合上可能存在问题.
根据您的MySQL版本,您可以查看GROUP_CONCAT