我有一个返回总和的查询,所以自然会返回 一个 行。
我需要计算数据库中记录数量的总和。
以下是我所讨论的查询类型(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之后的计数值?
答案 0 :(得分:1)
如果你想要一个完全解耦的处理方法,只需运行查询来获取你用SUM()
添加的所有行,然后用PHP将它们一起添加。
$sum = 0;
foreach($query->result() as $row)
{
$sum += $row->quantity_on_hand;
}
或类似的东西。
答案 1 :(得分: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计算它们。上面的代码切换到追逐,只是要求DB进行计数而不返回任何其他内容(因为它使用了mysql的COUNT())
至于为什么$ query-> num_rows();无效。确保您在CI查询结果对象上调用num_rows。你应该有这样的东西:
$your_query = $this->db->query("YOUR QUERY");
$your_query->num_rows()
答案 2 :(得分:0)
如果你想在$ this-> db-> select()函数中使用任何MySQL函数,则将第二个参数传递为FALSE。
所以它应该是$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' , FALSE)
答案 3 :(得分:0)
嗯......虽然它与我最初设想的方向不同,但最终我simply extending CI via the directions found HERE。
我添加了select_count()
方法,以匹配现有的select_min()
,select_max()
和select_sum()
方法。
此添加仅适用于MySQL,但它是一个可靠的解决方案。
如果将来有人遇到类似的问题,这就是我的所作所为:
<?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 */
}
希望它有所帮助。