Prestashop SQL Manager GROUP BY日期

时间:2015-12-22 15:52:27

标签: mysql prestashop

我正在为Prestashop中的SQL Manager编写一些查询 我想按月分组:

SELECT AVG(total_products)
FROM ps_order_invoice
GROUP BY YEAR(delivery_date), MONTH(delivery_date)

但是SQL Manager拒绝保存它,只显示消息“Error”。

除了只接受SELECT个查询外,我找不到有关SQL Manager限制的更多信息 但是,如果我删除YEARMONTH函数,我可以保存查询。

注意:不幸的是,我无法访问phpmyadmin

1 个答案:

答案 0 :(得分:2)

我安装了一个新的prestashop-1.6.0.6并且能够得到你的错误。 检查代码后,我发现问题来自RequestSql类。

cutAttribute方法无法解析“YEAR(delivery_date)”之类的属性。它返回一个字符串,如“YEARdelivery_date”而不是“delivery_date”。

要解决此问题,您可以覆盖此类并使用上一个prestashop版本中的cutAttribute方法。

使用以下内容创建位于“override / classes”中的名为“RequestSql.php”的文件:     

class RequestSql extends RequestSqlCore
{
    /**
     * Cut an attribute with or without the alias
     *
     * @param $attr
     * @param $from
     * @return array|bool
     */
    public function cutAttribute($attr, $from)
    {
        $matches = array();
        if (preg_match('/((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))\.((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))$/i', $attr, $matches, PREG_OFFSET_CAPTURE)) {
            $tab = explode('.', str_replace(array('`', '(', ')'), '', $matches[0][0]));
            if ($table = $this->returnNameTable($tab[0], $from)) {
                return array(
                    'table' => $table,
                    'alias' => $tab[0],
                    'attribut' => $tab[1],
                    'string' => $attr
                );
            }
        } elseif (preg_match('/((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))$/i', $attr, $matches, PREG_OFFSET_CAPTURE)) {
            $attribut = str_replace(array('`', '(', ')'), '', $matches[0][0]);
            if ($table = $this->returnNameTable(false, $from, $attr)) {
                return array(
                    'table' => $table,
                    'attribut' => $attribut,
                    'string' => $attr
                );
            }
        }
        return false;
    }
}

删除文件“cache / class_index.php”,否则将无法找到覆盖。