SESSION group_concat_max_len size is not enough,改变size时报不同的错误

SESSION group_concat_max_len size is not enough, it gives a different error when changing the size

所以我在 MySQL 中创建了一个存储过程,它接受一个整数 _prof_id。此代码用于将我的行动态更改为列。 这是我的代码

DELIMITER $$
CREATE PROCEDURE Get_Attendance(IN _profID INT)
BEGIN
    SET SESSION group_concat_max_len = 18446744073709547520;

    SET @sql = NULL;

    SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(date = ''',
      date,
      ''', status_description, NULL)) AS ',
      date
    )
  ) INTO @sql
      FROM current_att_view;

    SET @sql = CONCAT(
                 'SELECT a.professor_fname, a.professor_lname, ', @sql,  
                  ' FROM professor_tbl m JOIN current_att_view a
                      ON m.professor_id = a.professor_id 
                   WHERE m.professor_id = ', _profID,' Group BY entity_ID');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
END$$
DELIMITER ;

所以我研究了一下,发现18446744073709547520是group_concat_max_len的最大值,不能无限。但是当我调用该过程时,它给了我一个错误 Mysql Error Image, which came from the 24th and 25th row of my table 24th and 25th row of table image。仍然有很多行需要连接。我应该怎么办?还是有任何其他方法可以让我动态地将行更改为列?

所以我的 current_att_view (这是一个创建的视图)结构是 current_att_view and the professor table structure is like this Professor Table 我想生成一个查询,使 table 结构像这样 Table Structure

当我尝试我的组连接代码时,输​​出显示为 output

扩展 comment.This 代码在 2016-2017 年的每一天都可以正常工作(尽管非常缓慢),即 730 天,这似乎超出了您的需要。我认为这证明我的 64 位机器上没有 group_concat 截断,其中 max_allowed_packed 至少是默认的 4194304。

drop procedure if exists p;

DELIMITER $$
CREATE PROCEDURE p(IN _profID INT)
BEGIN
    SET SESSION group_concat_max_len = 18446744073709547520;
    #SET SESSION group_concat_max_len = 1024;

    SET @sql = NULL;

set @sql = (
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT('MAX(IF(dte = ', char(39),dte,char(39), ', 1, 0)) AS ', char(39),dte,char(39))
    )
from dates
where year(dte) in(2016,2017)
);
/*
    SET @sql = CONCAT(
                 'SELECT a.professor_fname, a.professor_lname, ', @sql,  
                  ' FROM professor_tbl m JOIN current_att_view a
                      ON m.professor_id = a.professor_id 
                   WHERE m.professor_id = ', _profID,' Group BY entity_ID');
*/
     set @sql = concat('select ',@sql,' from dates;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
     deallocate prepare stmt;
END$$
DELIMITER ;

call p(1);

下面是您数据的简化版本的猜测

drop table if exists current_att_view,professor_tbl;
create table current_att_view
(attendanceid int auto_increment primary key,
entity_id int,
Professor_id int,
dte date,
status_description varchar(8));

create table professor_tbl
(professor_id int, professor_fname varchar(20), professor_lname varchar(20));

insert into current_att_view (entity_id ,
Professor_id ,
dte ,
status_description) values
(1,1,'2018-01-01','Present'),(1,1,'2018-01-02','Absent'),(1,1,'2018-01-03','Present'),
(2,1,'2018-01-01','Absent'),(2,1,'2018-01-02','Absent'),(2,1,'2018-01-03','Present');

insert into professor_tbl values
(1,'bob','smith'),(2,'fred','jones');

select p.professor_fname,p.professor_lname, dte,status_description
from professor_tbl p
join current_att_view a on a.professor_id = p.professor_id

这个程序

drop procedure if exists p;
DELIMITER $$
CREATE PROCEDURE p(IN _profID INT)
BEGIN
    SET SESSION group_concat_max_len = 18446744073709547520;
    #SET SESSION group_concat_max_len = 1024;

    SET @sql = NULL;

set @sql = (
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT('MAX(IF(dte = ', char(39),dte,char(39), ', status_description , null)) AS ', char(39),dte,char(39))
    )
from current_att_view
);
select length(@sql);

    SET @sql = CONCAT(
                 'SELECT m.professor_lname,m.professor_fname,entity_id ,', @sql,  
                  ' FROM professor_tbl m JOIN current_att_view a
                      ON m.professor_id = a.professor_id 
                   WHERE m.professor_id = ', _profID,' Group BY m.professor_lname,m.professor_fname,entity_id ');

     #set @sql = concat('select ',@sql,' from attendance;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
     deallocate prepare stmt;
END$$
DELIMITER ;

生成此查询

SELECT m.name,entity_id ,MAX(IF(dte = '2018-01-01', status_description , null)) AS '2018-01-01',
        MAX(IF(dte = '2018-01-02', status_description , null)) AS '2018-01-02',
        MAX(IF(dte = '2018-01-03', status_description , null)) AS '2018-01-03' 
FROM professor_tbl m 
JOIN current_att_view a  ON m.id = a.professor_id 
WHERE m.id = 1 Group BY m.name, a.entity_ID;

产生此结果(如预期)

-----------------+-----------------+-----------+------------+------------+------------+
| professor_lname | professor_fname | entity_id | 2018-01-01 | 2018-01-02 | 2018-01-03 |
+-----------------+-----------------+-----------+------------+------------+------------+
| smith           | bob             |         1 | Present    | Absent     | Present    |
| smith           | bob             |         2 | Absent     | Absent     | Present    |
+-----------------+-----------------+-----------+------------+------------+------------+
2 rows in set (0.01 sec)

我想我帮不了你了。