正如其他人所说,您可以登录到您的 MySQL 服务器,发出 SHOW PROCESSLIST,找到要放弃的查询的编号,然后发出 KILL number 命令。
您似乎希望此功能为您的报表设计用户提供自助服务,而不是让他们打电话给您网络运营中的某个人并要求他们这样做,或者教他们使用管理工具。
我以前做过这种事情。它需要三个部分。
首先,您需要安排在用户可能希望放弃的查询类型中插入标签。例如,如果您的用户正在这样做
SELECT cust_id, SUM(orders), COUNT(orders)
FROM big_fat_table
GROUP BY cust_id
您需要更改查询的文本,使其在评论中嵌入标签,例如这样。
SELECT /*report:user2290084*/ cust_id, SUM(orders), COUNT(orders)
FROM big_fat_table
GROUP BY cust_id
请注意,此标签中有两个项目:report: 和一个用户 ID。用户 ID 必须与运行查询的连接无关——如果您试图放弃在其上运行的查询,该连接将被绑定。该标签根本不影响查询的执行。它只是显示在服务器的进程表中。
第二:运行这些查询的 PDO 代码将需要良好且用户友好的异常处理,因为让查询在您的代码下面爆炸将成为例行公事。您将需要对此进行试验,以使此放弃查询功能对您的用户有用。
第三:当你需要放弃对user2290084的报表查询时发出这个查询
select id from information_schema.processlist where info like '%/*%report:user2290084*/%'
它通过进程列表查找带有适当标记的查询的进程 ID。然后发出
kill <<that process id>>
你已经放弃了查询。
在 php 中,它可能看起来像这样:
$q = 'select id from information_schema.processlist where info like :tag';
$tag = '%/*report:' . $userid . '*/%'
$stmt = $dbh->prepare($q);
$stmt->bindParam(':tag', $tag);
$stmt->execute();
$pids = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
foreach ($pid in $pids) {
$dbh->query('KILL ' . $pid);
}
请注意,此代码中有一个循环。您可能会为此用户运行多个报告查询,或者没有。