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)
我想我帮不了你了。
所以我在 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)
我想我帮不了你了。