6

私はcakephpとmysqlサイトの検索機能を構築しようとしています。商品の価格や長さなどのさまざまなパラメーターを選択すると、一致する結果の数を返すajax呼び出しがトリガーされます。返された結果を、長さと価格の最小値と最大値で拡張したいと思います。私はこれをやってみました、http://bin.cakephp.org/view/1004813660。最初の4つの検索結果を使用するには時間がかかりすぎます。最後のものはローカルで機能しますが、エラーが発生します。

1140-GROUP BY句がない場合、GROUP列(MIN()、MAX(),, ...)とGROUP列の混合は不正です`

ONLY_FULL_GROUP_BYがオンになっているため、リモートで。

いくつかの改善を加えて最後のオプションを使用することは可能ですか、それともONLY_FULL_GROUP_BYをオフにすることはできますか?

4

3 に答える 3

2

私があなたをよく理解しているなら、あなたは単一の要求に参加したいです

  • min_priceとしてのMIN(Yacht.price)
  • MAX(Yacht.price)as max_price
  • min_lengthとしてのMIN(Yacht.long)
  • MAX(Yacht.long)as max_length

右 ?

このため、「GroupBy」句は必要ありません。MIN関数とMAX関数は、すでに集計関数です。ただし、1つのリクエストで複数の集計関数を使用することを妨げるものは何もありません。

単純にこれをやってみましたか?

$stats = $this->Yacht->find(array(
    'conditions' => $conditions,
    'fields' => array(
        'MIN(Yacht.price) as min_price',
        'MAX(Yacht.price) as max_price',
        'MIN(Yacht.long) as min_length',
        'MAX(Yacht.long) as max_length'
     )
    )
);

ちなみに、ドキュメントによると、元のコードにはかなりの冗長性があるようです。「find('first'、array(...))」自体は、結果を1つだけ取得することを保証するため、リクエストや「order」句で「'limit'=>1」を指定する必要はありません。とにかく1つのフィールドだけになります:)

それが役に立てば幸い。

于 2012-07-17T01:32:57.990 に答える
1

サーバーモードを設定する方法はここにあります...ドキュメントの上部を読むと、サーバーモードのデフォルトを設定する方法がわかります。

http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html

しかし、それがあなたの解決策にたどり着くために必要かどうかはわかりません。コード内に別のgroupbyが必要であり、クエリが少ないため、クエリは長時間実行されていると思います。主キー(インデックス)を最大化する論理グループを使用できるはずです。

'group' => 'Yacht.id'

したがって、すべてを返す1つのクエリがあります。

$this->Yacht->find('first', array(
'conditions' => $conditions,
'fields' => array('MAX(Yacht.price) as max_price', 'MIN(Yacht.price) as min_price', ...)
'group' => 'Yacht.id'
'order' => '...'));
于 2012-07-11T20:56:19.560 に答える
0

結局、検索方法を変えて問題を解決しました。結合につながる条件でクエリを実行する代わりに、whereを使用して明示的に検索を実行しました。私は次のようなものを持っていました

$conditions = array('Brand.name LIKE'=> '%bla%');

置き換えました

 $condtions = array('Yacht.brand_name LIKE' => '%bla%');

データベースを少し再構築する必要がありましたが、速度とデータベースの正規化の間のトレードオフは私が生きることができるものです。

于 2012-07-31T15:41:07.593 に答える