不能准备查询,也没有错误输出


Can't prepare a query and no error output

今天我的脚本有一些问题,我不能准备查询,脚本不返回任何错误:

表结构(错误的表,更正):

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,可以使用字符串分隔符。我假设列是整数(我没有仔细检查上面的表定义),并删除了字符串分隔符,因为它们对于整数来说不是必需的。