【问题标题】:Tag Aggregation Data index process unknown error标签聚合数据索引处理未知错误
【发布时间】:2016-01-27 22:59:24
【问题描述】:

我似乎在对 Magento 进行索引时遇到问题。所有可用的索引索引都很好,除了一个:

标签聚合数据

通过以下错误进行索引时,但我不太清楚问题是什么。

Tag Aggregation Data index process unknown error:
exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'COUNT(tr.customer_id) + MIN(IF(tp.base_popularity IS NOT NULL, tp.base_popularity, 0))' in 'field list'' in /mywebsite-domain/httpd.www/lib/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 /mywebsite-domain/httpd.www/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 /mywebsite-domain/httpd.www/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#2 /mywebsite-domain/httpd.www/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#3 /mywebsite-domain/httpd.www/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#4 /mywebsite-domain/httpd.www/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ma...', Array)
#5 /mywebsite-domain/httpd.www/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ma...', Array)
#6 /mywebsite-domain/httpd.www/app/code/core/Mage/Tag/Model/Resource/Indexer/Summary.php(233): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ma...')
#7 /mywebsite-domain/httpd.www/app/code/core/Mage/Tag/Model/Resource/Indexer/Summary.php(135): Mage_Tag_Model_Resource_Indexer_Summary->aggregate()
#8 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Indexer/Abstract.php(143): Mage_Tag_Model_Resource_Indexer_Summary->reindexAll()
#9 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Process.php(210): Mage_Index_Model_Indexer_Abstract->reindexAll()
#10 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Process.php(258): Mage_Index_Model_Process->reindexAll()
#11 /mywebsite-domain/httpd.www/shell/indexer.php(168): Mage_Index_Model_Process->reindexEverything()
#12 /mywebsite-domain/httpd.www/shell/indexer.php(216): Mage_Shell_Compiler->run()
#13 {main}

Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'COUNT(tr.customer_id) + MIN(IF(tp.base_popularity IS NOT NULL, tp.base_popularity, 0))' in 'field list', query was: INSERT INTO `magentotag_summary` (`tag_id`, `store_id`, `customers`, `products`, `popularity`, `uses`, `historical_uses`, `base_popularity`) SELECT `tr`.`tag_id`, `tr`.`store_id`, COUNT(DISTINCT tr.customer_id) AS `customers`, COUNT(DISTINCT tr.product_id) AS `products`, `COUNT(tr.customer_id) + MIN(IF(tp.base_popularity IS NOT NULL, tp`.`base_popularity, 0))` AS `popularity`, 0 AS `uses`, 0 AS `historical_uses`, 0 AS `base_popularity` FROM `magentotag_relation` AS `tr`
 INNER JOIN `magentocore_store` AS `cs` ON cs.store_id = tr.store_id
 INNER JOIN `magentocatalog_product_website` AS `pw` ON cs.website_id = pw.website_id AND tr.product_id = pw.product_id
 INNER JOIN `magentocatalog_product_entity` AS `e` ON tr.product_id = e.entity_id
 LEFT JOIN `magentotag_properties` AS `tp` ON tp.tag_id = tr.tag_id AND tp.store_id = tr.store_id
 INNER JOIN `magentocatalog_product_entity_int` AS `tad_status` ON tad_status.entity_id = e.entity_id AND tad_status.attribute_id = 273 AND tad_status.store_id = 0
 LEFT JOIN `magentocatalog_product_entity_int` AS `tas_status` ON tas_status.entity_id = e.entity_id AND tas_status.attribute_id = 273 AND tas_status.store_id = cs.store_id
 INNER JOIN `magentocatalog_product_entity_int` AS `tad_visibility` ON tad_visibility.entity_id = e.entity_id AND tad_visibility.attribute_id = 526 AND tad_visibility.store_id = 0
 LEFT JOIN `magentocatalog_product_entity_int` AS `tas_visibility` ON tas_visibility.entity_id = e.entity_id AND tas_visibility.attribute_id = 526 AND tas_visibility.store_id = cs.store_id
 INNER JOIN `magentocataloginventory_stock_status` AS `ciss` ON ciss.product_id = e.entity_id AND ciss.website_id = cs.website_id WHERE (tr.active = 1) AND (IF(IFNULL(tas_status.value_id, -1) > 0, tas_status.value, tad_status.value)=1) AND (IF(IFNULL(tas_visibility.value_id, -1) > 0, tas_visibility.value, tad_visibility.value)!=1) AND (ciss.stock_status = 1) GROUP BY `tr`.`tag_id`,
        `tr`.`store_id` ON DUPLICATE KEY UPDATE `tag_id` = VALUES(`tag_id`), `store_id` = VALUES(`store_id`), `customers` = VALUES(`customers`), `products` = VALUES(`products`), `popularity` = VALUES(`popularity`), `uses` = VALUES(`uses`), `historical_uses` = VALUES(`historical_uses`), `base_popularity` = VALUES(`base_popularity`)' in /mywebsite-domain/httpd.www/lib/Zend/Db/Statement/Pdo.php:235
Stack trace:
#0 /mywebsite-domain/httpd.www/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /mywebsite-domain/httpd.www/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /mywebsite-domain/httpd.www/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /mywebsite-domain/httpd.www/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ma...', Array)
#4 /mywebsite-domain/httpd.www/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ma...', Array)
#5 /mywebsite-domain/httpd.www/app/code/core/Mage/Tag/Model/Resource/Indexer/Summary.php(233): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ma...')
#6 /mywebsite-domain/httpd.www/app/code/core/Mage/Tag/Model/Resource/Indexer/Summary.php(135): Mage_Tag_Model_Resource_Indexer_Summary->aggregate()
#7 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Indexer/Abstract.php(143): Mage_Tag_Model_Resource_Indexer_Summary->reindexAll()
#8 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Process.php(210): Mage_Index_Model_Indexer_Abstract->reindexAll()
#9 /mywebsite-domain/httpd.www/app/code/core/Mage/Index/Model/Process.php(258): Mage_Index_Model_Process->reindexAll()
#10 /mywebsite-domain/httpd.www/shell/indexer.php(168): Mage_Index_Model_Process->reindexEverything()
#11 /mywebsite-domain/httpd.www/shell/indexer.php(216): Mage_Shell_Compiler->run()
#12 {main}

有什么线索吗?

谢谢。

【问题讨论】:

    标签: php mysql pdo magento-1.9


    【解决方案1】:

    插入错误的反引号是因为 Zend_Db_Select->_tableCols() 未能将 COUNT(tr.customer_id) + MIN(IF(tp.base_popularity IS NOT NULL, tp.base_popularity, 0)) 检测为某个 SQL 函数,然后应该将其传递给 Zend_Db_Expr()。相反,它被检测为 [currentCorrelationName].[col],然后作为普通字符串处理。

    解决此问题的方法是放松用于检测 SQL 函数的正则表达式:

    打开lib/Zend/Db/Select.php,找到下面一行,去掉字符串结束符号($):

    const REGEX_COLUMN_EXPR = '/^([\w]*\(([^\(\)]|(?1))*\))$/';
    

    ...所以它看起来像这样:

    const REGEX_COLUMN_EXPR = '/^([\w]*\(([^\(\)]|(?1))*\))/';
    

    现在,Zend_Db_Select->_tableCols() 应该将整个表达式传递给Zend_Db_Expr(),SQL 错误应该会消失。

    【讨论】:

      【解决方案2】:

      我认为这不是索引错误。如果你仔细检查insert ... select ...语句的select部分,那么你可以看到表达式COUNT(tr.customer_id) + MIN(IF(tp.base_popularity IS NOT NULL, tp.base_popularity, 0))被反引号(`)括起来,这意味着mysql试图将其解释为列名而不是作为一种表达。显然,没有这样的列,因此出现错误消息。删除此表达式周围的反引号,错误消息将消失。

      【讨论】:

        【解决方案3】:

        我也有同样的问题。 @Shadow Summary.php 中没有反引号

        /**
         * Aggregate tags by specified ids
         *
         * @param null|int|array $tagIds
         * @return Mage_Tag_Model_Resource_Indexer_Summary
         */
        public function aggregate($tagIds = null)
        {
            $writeAdapter = $this->_getWriteAdapter();
            $this->beginTransaction();
        
            try {
                if (!empty($tagIds)) {
                    $writeAdapter->delete(
                        $this->getTable('tag/summary'), array('tag_id IN(?)' => $tagIds)
                    );
                } else {
                    $writeAdapter->delete($this->getTable('tag/summary'));
                }
        
                $select = $writeAdapter->select()
                    ->from(
                        array('tr' => $this->getTable('tag/relation')),
                        array(
                            'tr.tag_id',
                            'tr.store_id',
                            'customers'         => 'COUNT(DISTINCT tr.customer_id)',
                            'products'          => 'COUNT(DISTINCT tr.product_id)',
                            'popularity'        => 'COUNT(tr.customer_id) + MIN('
                                . $writeAdapter->getCheckSql(
                                    'tp.base_popularity IS NOT NULL',
                                    'tp.base_popularity',
                                    '0'
                                    )
                                . ')',
                            'uses'              => new Zend_Db_Expr(0), // deprecated since 1.4.0.1
                            'historical_uses'   => new Zend_Db_Expr(0), // deprecated since 1.4.0.1
                            'base_popularity'   => new Zend_Db_Expr(0)  // deprecated since 1.4.0.1
                        )
                    )
        

        希望有人能解决这个问题。几乎什么都试过了。

        【讨论】:

        • 我在 Magento 1.9.2.4 中遇到了完全相同的 SQL 错误。你找到解决办法了吗?
        【解决方案4】:

        我最近在一个客户网站上得到了这个,全新安装,基本上是基本的 1.9.3.2 安装

        这是我发现的:

        该站点(当然)使用 composer 来安装一些基础包。

        其中一个是这样的:

        colinmollenhour/magento-redis-session": "^2.0"

        依次加载依赖项

        - Installing magento/zendframework1 (1.12.16-patch3) Downloading: 100% Extracting archive REASON: colinmollenhour/php-redis-session-abstract v1.3.1 requires magento/zendframework1 ~1.12.0 -> satisfiable by magento/zendframework1[1.12.0, 1.12.1, 1.12.10, 1.12.13, 1.12.16, 1.12.16-patch1, 1.12.16-patch2, 1.12.16-patch3, 1.12.2, 1.12.3, 1.12.4, 1.12.5, 1.12.6, 1.12.7, 1.12.8, 1.12.9, 1.12.9-patch1]. 因此,magento/zendframework1 的更新已安装到供应商中。此时安装的是'magento/zendframework1:1.12.16-patch3'

        一旦我删除了 redis-session composer 包,它删除了 zend 更新,事情就恢复正常了。

        Removals: colinmollenhour/magento-redis-session, colinmollenhour/php-redis-session-abstract, magento/zendframework1, colinmollenhour/credis - Removing colinmollenhour/magento-redis-session (2.0.2) - Removing colinmollenhour/php-redis-session-abstract (v1.3.1) - Removing magento/zendframework1 (1.12.16-patch3) - Removing colinmollenhour/credis (1.7)

        包安装的作曲家条目设置为安装版本 2.0 > 查看软件包版本 (https://github.com/colinmollenhour/Cm_RedisSession/releases)

        v1.12 被标记为:切换到 Magento 2 兼容版本之前的最后一个版本。

        将作曲家锁定到该版本:"colinmollenhour/magento-redis-session": "1.12"

        解决了问题,并将 redis-session 更新保留到 magento 代码库中。

        所以,基本上,问题是 redis-session > 1.12 不兼容 m1。

        【讨论】:

        猜你喜欢
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 2019-09-01
        • 2017-03-12
        • 2016-03-18
        • 2018-08-02
        • 2020-08-13
        • 1970-01-01
        相关资源
        最近更新 更多