假设我在MySQL数据库中有两个表。
表格1:
ID Name 1 Jim 2 Bob
表2:
ID Place Race_Number 1 2nd 1 1 3rd 2 1 4th 3 2 1st 1 2 2nd 2 2 2nd 3
从数据库中选择行时,是否有任何方法可以将第二个表中的行作为列连接到第一个表中?目前我正在使用SELECT * FROM Table1 NATURAL JOIN Table2。
SELECT * FROM Table1 NATURAL JOIN Table2
输出:
ID Name Place Race_Number 1 Jim 2nd 1 1 Jim 3rd 2 1 Jim 4th 3 2 Bob 1st 1 2 Bob 2nd 2 2 Bob 2nd 3
目前,我正在PHP脚本中对此进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看ID,看看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在MySQL中正确执行此操作,而不必在PHP中将其分类为数组。每个ID在第二个表中可以有无限多个条目。
直接从MySQL查询获得的期望结果是:
ID Name Race1 Race2 Race3 1 Jim 2nd 3rd 4th 2 Bob 1st 2nd 2nd
我自己无法在表中为Race1,Race2等创建列,因为每个ID可以有无限数量的比赛。
谢谢你的帮助!
一个INNER JOIN就足够了您的需求。MySQL没有PIVOT功能,您仍然可以使用CASE和MAX()功能对其进行仿真。
INNER JOIN
PIVOT
CASE
MAX()
SELECT a.ID, a.NAME, MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1, MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2, MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3 FROM Table1 a INNER JOIN Table2 b ON a.ID = b.ID GROUP BY a.ID, a.Name
但是,如果您不知道的数量RACE,则DYNAMIC SQL首选a。
RACE
DYNAMIC SQL
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number, ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`')) ) INTO @sql FROM Table2; SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' FROM Table1 a LEFT JOIN Table2 b ON ON a.ID = b.ID GROUP BY a.ID, a.Name'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;