代码之家  ›  专栏  ›  技术社区  ›  Petay87

无法运行准备好的语句,因为用户变量太长?

  •  0
  • Petay87  · 技术社区  · 7 年前

    问题

    我有一个工作存储过程(SP),它接受3个参数(id、from date和to date)。这个SP在我的测试系统中工作得很好,所有的值都是从 t1.name 在 GROUP_CONACT GROUP_CONCAT .

    问题是,当我把这个放到实时系统中时,还有一些问题需要补充到 GORUP_CONCAT t1.名称

    @SQL 无法存储从 查询。

    代码

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

    组\u 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>
    1 回复  |  直到 7 年前
        1
  •  1
  •   Giorgos Myrianthous    7 年前

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

    SET GLOBAL group_concat_max_len=..;
    

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

    [mysqld]
    group_concat_max_len=..