今天我的脚本有一些问题,我不能准备查询,脚本不返回任何错误:
表结构(错误的表,更正):
CREATE TABLE IF NOT EXISTS `razorphyn_support_users` (
`id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`mail` VARCHAR(50) NOT NULL,
`password` VARCHAR(200) NOT NULL,
`reg_key` VARCHAR(260) NOT NULL,
`tmp_password` VARCHAR(31) NULL,
`ip_address` VARCHAR(50) NOT NULL,
`status` ENUM('0','1','2','3','4') NOT NULL DEFAULT '3',
`holiday` ENUM('0','1') NOT NULL DEFAULT '0',
`assigned_tickets` INT(5) UNSIGNED NOT NULL DEFAULT 0,
`solved_tickets` BIGINT(11) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY(`mail`))
ENGINE=MyISAM
DEFAULT CHARSET=utf8
AUTO_INCREMENT=55;
Unpreparable字符串:
$query = "SELECT `id` FROM ".$SupportUserTable."
WHERE `status`='2' AND `holiday`='0' AND MIN(`assigned_tickets`)
ORDER BY `solved_tickets` ASC" ;
完整代码(实际上这只是它的一部分,$stmt
已经启动并工作,基本上它已经连接):
file_put_contents('ok.txt','');
$query = "SELECT `id` FROM ".$SupportUserTable."
WHERE `status`='2' AND `holiday`='0' AND MIN(`assigned_tickets`)
ORDER BY `solved_tickets` ASC" ;
$prepared = $stmt->prepare($query);
if($prepared){
file_put_contents('ok2.txt','');
if($stmt->execute()){
file_put_contents('ok3.txt','');
$stmt->store_result();
$result = $stmt->bind_result($id);
file_put_contents('eafv.txt','id: '.$id);
if($stmt->num_rows>0){
$query = "UPDATE ".$SupportTicketsTable." SET operator_id=?
WHERE id=? ";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('ii', $id,$tkid)){
if($stmt->execute()){
echo json_encode(array(0=>'Created'));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>'No Operator Available'));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>$stmt->error));
在SQL的WHERE子句中不能放MIN()表达式。MIN()表达式只能放在select-list、HAVING子句和ORDER BY子句中。
你想要的是:
我想选择具有最少开放票数的操作符,如果有多个具有相同值的操作符[然后]选择具有较少已解决票的操作符
下面是得到这个结果的解决方案:
SELECT `id` FROM razorphyn_support_users
WHERE `status` = 2 AND `holiday` = 0
ORDER BY `assigned_tickets` ASC, `solved_tickets` ASC
LIMIT 1
你的评论:
有关LIMIT语法,请参阅https://stackoverflow.com/a/3325580/20860或MySQL手册,其中说:
为了与PostgreSQL兼容,MySQL还支持LIMIT row_count OFFSET偏移语法。
如果类型是字符串或enum,可以使用字符串分隔符。我假设列是整数(我没有仔细检查上面的表定义),并删除了字符串分隔符,因为它们对于整数来说不是必需的。