2

我有一个返回总和的查询,所以它自然会返回一行
我需要计算数据库中产生该总和的记录数。

这是我正在谈论的查询类型的示例(MySQL):

SELECT 
    i.id, 
    i.vendor_quote_id, 
    i.product_id_requested, 
    SUM(i.quantity_on_hand) AS qty, 
    COUNT(i.quantity_on_hand) AS count
FROM vendor_quote_item AS i
JOIN vendor_quote_container AS c 
    ON i.vendor_quote_id = c.id
LEFT JOIN company_types ON company_types.company_id = c.company_id
WHERE company_types.company_type =  'f'
AND i.product_id_requested =  12345678

我已经找到并且现在正在使用 select_min()、select_max() 和 select_sum() 函数,但我的COUNT()仍然是硬编码的。

主要问题是我必须以紧密耦合的方式指定表名,扼杀$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' )可移植性并使切换环境成为 PIA。

我如何/应该如何以非耦合的方式获得我所追求的 CI 计数值?

4

4 回答 4

1

如果您想要一种完全解耦的方式来处理这个问题,只需运行查询以获取您要添加的所有行SUM(),然后在 PHP 中将它们添加到一起。

$sum = 0;
foreach($query->result() as $row)
{
    $sum += $row->quantity_on_hand;
}

或类似的东西。

于 2012-10-29T21:13:56.327 回答
0

如何在 var 或 const 中定义表,然后像这样进行查询:

define('VENDOR_QUOTE_ITEM', 'vendor_quote_item');
$this->$db->select( 'COUNT(' . VENDOR_QUOTE_ITEM . '.quantity_on_hand) AS count' );

这应该比 $query->num_rows() 更快,因为它会检索结果并让 PHP 计算它们。上面的代码切入正题,只向数据库询问计数而不返回任何其他内容(因为它使用了 mysql 的 COUNT())

至于为什么 $query->num_rows(); 不起作用..确保您在 CI 查询结果对象上调用 num_rows 的 var。你应该有这样的东西:

$your_query = $this->db->query("YOUR QUERY");
$your_query->num_rows() 
于 2012-10-29T20:47:39.703 回答
0

如果您想在 $this->db->select() 函数中使用任何 MySQL 函数,请将第二个参数作为 FALSE。

所以应该是$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' , FALSE)

于 2012-10-30T04:57:49.453 回答
0

嗯......虽然它与我最初设想的方向不同,但我最终只是通过 HERE 找到的方向来扩展 CI

我添加了一个select_count()方法来匹配现有的select_min()select_max()select_sum()方法。
此添加目前仅适用于 MySQL,但它是一个可靠的解决方案。

如果将来有人遇到类似的问题,这就是我所做的:

  1. 我将 Simons "MY_Loader" 直接放到了我的 "application/core" 目录中(不需要改变任何东西)。
  2. 然后我按照他的指示在“application/core”目录中创建了一个“MY_DB_mysql_driver”……并使它看起来像这样:(为了简洁起见,没有评论)

.

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class My_DB_mysql_driver extends CI_DB_mysql_driver {

    final public function __construct($params) {
        parent::__construct($params);
        log_message('debug', 'Extended DB driver class instantiated!');

    }  /* method: __CONSTRUCT */

    final public function select_count($select = '', $alias = ''){

        if ( !is_string($select) OR $select == ''){
            $this->display_error('db_invalid_query');
        }
        if ($alias == ''){
            $alias = $this->_create_alias_from_table(trim($select));
        }
        $sql = 'COUNT('.$this->_protect_identifiers(trim($select)).') AS '.$alias;
        $this->ar_select[] = $sql;
        if ($this->ar_caching === TRUE){
            $this->ar_cache_select[] = $sql;
            $this->ar_cache_exists[] = 'select';
        }

        return $this;

    }  /* method: SELECT_COUNT */

}

希望能帮助到你。

于 2012-10-31T14:49:53.900 回答