3

問題: 列に対する count() 操作を含むが、文字列形式でカウントを返すクエリを作成しています。その結果、フロントエンドでのソートがめちゃくちゃになります。

詳細: Zend で次のクエリを作成しています。

$select = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('s' => 'student'),
            array('s.id', 
            'start_date' => new Zend_Db_Expr("date(s.start_date)"), 
            ))
        ->joinLeft(array('ps' => 'pstudent'), 
                's.id = ps.st_id',
                array('pscount' => new Zend_Db_Expr('count(ps.st_id)')  ))
        ->where('ps.status = "phd"');

$result = $this->getAdapter()->fetchAll($select);

このクエリは、pscountを使用して を返しますZend_Db_Expr (count(ps.st_id))。コードの後半で、このデータを json 形式にエンコードし、フロントエンドに戻ります。db からのデータは文字列 (つまりpscount、文字列) として取得されるため、グリッドの列のフロント エンドで並べ替えるとpscount、次のシーケンスが得られます。

1
10
100
11
12
13

ただし、数値でソートしたいので、出力は次のようになります。

1
10
11
12
13
100

Zend_Db_Exprasを書いてみましnew Zend_Db_Expr('cast(count(ps.study_id) as signed)')たが、結果に変化はありません。アプリケーションの要件により、クエリでもorder byを使用できません。他の唯一のオプションは、 をトラバースしてからphp コードで型変換を$result行う場合です。(int)ただし、それは最後のオプションです。 不必要に結果をたどる必要がないように、mysqlクエリでこれを行うことをお勧めします。

どんな助けでも本当に感謝しています。

4

1 に答える 1

0

文字列の配列として取得して使用するだけsort($someArray, SORT_NUMERIC)です。これにより、数値であるかのように並べ替えられます。

複雑なオブジェクトを並べ替える必要がある場合は、usort() を比較関数と共に使用します。

を使用せずに mysql 内で結果を注文できるとは思いませんorder by

于 2012-08-15T19:18:38.850 に答える