これを回避するには、永続的な「一時」テーブルを作成し、SPID(申し訳ありませんが、SQL Serverの土地です)をテーブル名に追加して、一意のテーブル名を作成しました。次に、動的SQLステートメントを作成してクエリを作成します。何か悪いことが起こった場合、テーブルは削除され、再作成されます。
より良いオプションを期待しています。おい、MySQL Devs。'バグ' / '機能リクエスト'は2008年からオープンしています!遭遇したすべての「バグ」は同じボートにあるようです。
select concat('ReviewLatency', CONNECTION_ID()) into @tablename;
#Drop "temporary" table if it exists
set @dsql=concat('drop table if exists ', @tablename, ';');
PREPARE QUERY1 FROM @dsql;
EXECUTE QUERY1;
DEALLOCATE PREPARE QUERY1;
#Due to MySQL bug not allowing multiple queries in DSQL, we have to break it up...
#Also due to MySQL bug, you cannot join a temporary table to itself,
#so we create a real table, but append the SPID to it for uniqueness.
set @dsql=concat('
create table ', @tablename, ' (
`EventUID` int(11) not null,
`EventTimestamp` datetime not null,
`HasAudit` bit not null,
`GroupName` varchar(255) not null,
`UserID` int(11) not null,
`EventAuditUID` int(11) null,
`ReviewerName` varchar(255) null,
index `tmp_', @tablename, '_EventUID` (`EventUID` asc),
index `tmp_', @tablename, '_EventAuditUID` (`EventAuditUID` asc),
index `tmp_', @tablename, '_EventUID_EventTimestamp` (`EventUID`, `EventTimestamp`)
) ENGINE=MEMORY;');
PREPARE QUERY2 FROM @dsql;
EXECUTE QUERY2;
DEALLOCATE PREPARE QUERY2;
#Insert into the "temporary" table
set @dsql=concat('
insert into ', @tablename, '
select e.EventUID, e.EventTimestamp, e.HasAudit, gn.GroupName, epi.UserID, eai.EventUID as `EventAuditUID`
, concat(concat(concat(max(concat('' '', ui.UserPropertyValue)), '' (''), ut.UserName), '')'') as `ReviewerName`
from EventCore e
inner join EventParticipantInformation epi on e.EventUID = epi.EventUID and epi.TypeClass=''FROM''
inner join UserGroupRelation ugr on epi.UserID = ugr.UserID and e.EventTimestamp between ugr.EffectiveStartDate and ugr.EffectiveEndDate
inner join GroupNames gn on ugr.GroupID = gn.GroupID
left outer join EventAuditInformation eai on e.EventUID = eai.EventUID
left outer join UserTable ut on eai.UserID = ut.UserID
left outer join UserInformation ui on eai.UserID = ui.UserID and ui.UserProperty=-10
where e.EventTimestamp between @StartDate and @EndDate
and e.SenderSID = @FirmID
group by e.EventUID;');
PREPARE QUERY3 FROM @dsql;
EXECUTE QUERY3;
DEALLOCATE PREPARE QUERY3;
#Generate the actual query to return results.
set @dsql=concat('
select rl1.GroupName as `Group`, coalesce(max(rl1.ReviewerName), '''') as `Reviewer(s)`, count(distinct rl1.EventUID) as `Total Events`
, (count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) as `Unreviewed Events`
, round(((count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) / count(distinct rl1.EventUID)) * 100, 1) as `% Unreviewed`
, date_format(min(rl2.EventTimestamp), ''%W, %b %c %Y %r'') as `Oldest Unreviewed`
, count(distinct rl3.EventUID) as `<=7 Days Unreviewed`
, count(distinct rl4.EventUID) as `8-14 Days Unreviewed`
, count(distinct rl5.EventUID) as `>14 Days Unreviewed`
from ', @tablename, ' rl1
left outer join ', @tablename, ' rl2 on rl1.EventUID = rl2.EventUID and rl2.EventAuditUID is null
left outer join ', @tablename, ' rl3 on rl1.EventUID = rl3.EventUID and rl3.EventAuditUID is null and rl1.EventTimestamp > DATE_SUB(NOW(), INTERVAL 7 DAY)
left outer join ', @tablename, ' rl4 on rl1.EventUID = rl4.EventUID and rl4.EventAuditUID is null and rl1.EventTimestamp between DATE_SUB(NOW(), INTERVAL 7 DAY) and DATE_SUB(NOW(), INTERVAL 14 DAY)
left outer join ', @tablename, ' rl5 on rl1.EventUID = rl5.EventUID and rl5.EventAuditUID is null and rl1.EventTimestamp < DATE_SUB(NOW(), INTERVAL 14 DAY)
group by rl1.GroupName
order by ((count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) / count(distinct rl1.EventUID)) * 100 desc
;');
PREPARE QUERY4 FROM @dsql;
EXECUTE QUERY4;
DEALLOCATE PREPARE QUERY4;
#Drop "temporary" table
set @dsql = concat('drop table if exists ', @tablename, ';');
PREPARE QUERY5 FROM @dsql;
EXECUTE QUERY5;
DEALLOCATE PREPARE QUERY5;