【发布时间】:2026-02-14 04:50:01
【问题描述】:
好的,我正在合并三个表来创建我的数据透视表。为简单起见,我将仅引用我为此使用的字段。
employees->userTblID, firstName, lastName
lms__trainings->trainingID,trainingName
lms__complete->completeID、trainingID、employeeID(userTblID)
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(b.trainingID = ''',F.trainingID, ''', b.completionDate, NULL)) AS ''', F.trainingName,"'")) INTO @sql FROM lms__trainings AS F INNER JOIN lms__complete AS G ON F.trainingID=G.trainingID;
SET @sql = CONCAT('SELECT a.userTblID, a.firstName, a.lastName, ', @sql, ' FROM employees AS a LEFT JOIN lms__complete AS b ON a.userTblID=b.employeeID WHERE a.cloudID=1 GROUP BY a.userTblID ORDER BY a.lastName');
PREPARE stmt FROM @sql;
EXECUTE stmt;
它可以很好地生成 PIVOT 表,但它只包含在 lms__complete 中具有关联记录的 trainingName 列。如果我从第 2 行删除内部连接或将其更改为左连接(在我看来,这不会将其限制为 lms__complete 条目并为您提供 lms__trainings 中的所有 trainingNames),它会给出很好的旧 1064 错误。
我知道它只是没有通过该程序发送所有 trainingID。我在想我在第 3 行的 LEFT JOIN 应该是 lms__trainings 和 lms__complete 之间的 UNION 的 LEFT JOIN,但我在过去几天没有在谷歌中输入正确的搜索参数来找到我需要的东西。
【问题讨论】:
-
如果出现错误,请添加错误消息。它可以极大地帮助您识别问题。对于根据您的描述最有可能的嫌疑人,请查看here。
-
就是这样!!!不知道限制,但我将其提高到 SET SESSION group_concat_max_len = 5000;并将第二行更改为我最初想要的 LEFT JOIN,它运行良好。
标签: mysql pivot prepared-statement