2

合計を返すクエリがあるため、当然1行が返されます。
その合計を作成した DB 内のレコード数をカウントする必要があります。

これは、私が話しているタイプのクエリのサンプルです (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

うーん...それは私が最初に想像したものとは異なる方向ですが、私はここで見つかった方向を介して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 に答える
0

var または const でテーブルを定義してから、次のようにクエリを実行するのはどうでしょうか。

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

結果を取得し、PHP にカウントさせるため、これは $query->num_rows() よりも高速です。上記のコードは本題に入り、他に何も返さずに DB にカウントを要求するだけです (mysql の COUNT() を使用しているため)。

なぜ $query->num_rows(); 動作していません.. var が CI クエリ結果オブジェクトで num_rows を呼び出していることを確認してください。次のようなものが必要です。

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

$this->db->select() 関数内で MySQL 関数を使用する場合は、2 番目のパラメータを FALSE として渡します。

だからそうあるべきだ$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' , FALSE)

于 2012-10-30T04:57:49.453 に答える