无法运行prepared语句,因为用户变量太长?

fdbelqdn  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(367)

问题

我有一个工作存储过程(sp),它接受3个参数(id、from date和to date)。这个sp在我的测试系统中工作得很好,所有的值都是从 t1.nameGROUP_CONACT 都很短,房间里也不多 GROUP_CONCAT .
问题是,当我把这个放到实时系统中时,还有一些问题需要补充到 GORUP_CONCAT 以及 t1.name 值比预期长得多。
从我在调试脚本时看到的结果来看,问题似乎是变量 @SQL 无法存储从 GROUP_CONACT 查询。

代码

CREATE DEFINER=`root`@`localhost` PROCEDURE `team_analyst_results`(in var1 int, in var2 DATE, in var3 DATE)
BEGIN

  SELECT
      GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(question_id = \'',
                  question_id,
                  '\', Pass, Null)) AS ',
                  CONCAT('\'', t1.name, '\'')))
  INTO @SQL FROM
      smhubdb.questions t1
          INNER JOIN
      smhubdb.check_questions t2 ON t1.id = t2.question_id
          INNER JOIN
      smhubdb.quality_checks t3 ON t2.check_id = t3.id
          INNER JOIN
      smhubdb.users t4 ON t3.check_person = t4.id
  WHERE
      t4.team_id = var1
  AND
    t3.checked_date BETWEEN var2 AND var3
  GROUP BY t3.check_person;

  SET @SQL = CONCAT('SELECT t1.id AS "'"Check ID"'", t4.name AS "'"Name"'" ,DATE_FORMAT(t1.checked_date, "'"%d-%m-%Y"'") AS "'" Check Date "'" , ', @SQL, ' , t1.notes AS "'"Notes"'", CONCAT(ROUND((SUM(CASE WHEN t2.pass = 1 THEN t3.value ELSE 0 END) / SUM(t3.value) * 100),0),"'""'") AS "'"Score"'" FROM smhubdb.quality_checks t1 LEFT JOIN smhubdb.check_questions t2 ON t1.id = t2.check_id LEFT JOIN smhubdb.questions t3 on t2.question_id = t3.id INNER JOIN smhubdb.users t4 ON t1.check_person = t4.id WHERE t4.team_id = ''', var1 ,''' AND t1.checked_date BETWEEN ''', var2 ,''' AND ''', var3 ,''' GROUP BY t1.id ORDER BY t1.id DESC');

  PREPARE stmt FROM @SQL;
  EXECUTE stmt;
END

我试过的

我试着 @SQL 作为一个局部变量(显然它去掉了@),但是我在试图准备代码底部的语句时遇到了一个错误,说明它不需要局部变量。

准则的目的

该代码用于从未知数量的结果填充数据透视表。意思是我需要第一个 GROUP_CONCAT 节来构建关于end语句的列名。

预期产量

不知道问题的数量,也不知道问题的名称。

table, td, th {
 border: 1px solid black;
}

table {
 border-collapse: collapse;
}
<table>
<thead>
<th>
Name
</th>
<th>
Check ID
</th>
<th>
Date
</th>
<th>
Question1
</th>
<th>
Question2
</th>
<th>
Question3
</th>
<th>
Question4
</th>
<th>
Notes
</th>
<th>
Score
</th>
</thead>
<tbody>
<tr>
<td>
Joe Bloggs
</td>
<td>
1
</td>
<td>
08/11/2018
</td>
<td>
Pass
</td>
<td>
Pass
</td>
<td>
Null
</td>
<td>
Pass
</td>
<td>
Some Notes
</td>
<td>
75%
</td>
<tr>
</tbody>
</table>
xkrw2x1b

xkrw2x1b1#

你需要增加 group_concat_max_len . 要做到这一点,你可以跑

SET GLOBAL group_concat_max_len=..;

但是,一旦数据库重新启动,此参数将不再有效。永久更改 group_concat_max_len ,您需要在下面添加以下行 my.cnf 文件:

[mysqld]
group_concat_max_len=..

相关问题