2012-07-09 9 views
6

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

clause`

よるNO基は、存在しない場合はないGROUP列のグループ列(MIN()、MAX(),, ...)の混合は違法です。

最後のオプションをいくつか改良して使用することはできますか、またはONLY_FULL_GROUP_BYをオフにすることはできますか?

答えて

0

私は検索方法を変更することで問題を解決しました。ジョインにつながる条件でクエリを実行する代わりに、明示的にどこで検索しましたか。私はデータベースを少し再構築しなければならなかった

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

に置き換え

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

、のようなものを持っていたが、スピードとデータベースの正規化の間のトレードオフは、私が一緒に暮らすことができるものです。

1

サーバーモードを設定する方法は、ここで見つけることができます...あなたは、ドキュメントの先頭を読んでいる場合には、サーバモードのデフォルトを設定する方法を教えてくれます:

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

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

'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' => '...')); 
+0

sql_modeを無効にする方法を見ていきます。しかし、私はグループ化しようとしていました。しかし、最初の結果が返されるという事実のために、それは私が順番に定義したものに関してのみ結果を与えるでしょう。たとえば、私がYacht.price ASCによって注文した場合、最小可能価格に対応する行全体が得られます。その他のパラメータは、期待される結果ではありません。 – Awemo

2

を単一のリクエストで取得するMIN_PRICEとして

  • MIN(Yacht.price)MAX_PRICE
  • として
  • MAX(Yacht.price)
  • MIN(Yacht.long)MIN_LENGTHとして
  • MAX(Yacht.long)MAX_LENGTH

権利として?

このため、「Group By」句は必要ありません。 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' 
    ) 
    ) 
); 

documentationによると、元のコードの冗長性のかなり多くがあるように思われます。 "find( 'first'、array(...))"は単独で結果が得られることを保証するため、要求に "'limit' => 1"を指定する必要はありません。とにかく1つのフィールドだけです:)

希望に役立ちます。

+0

私はそれを試みました。しかし、ローカルサイトでは動作しますが、リモートサイトでは動作しません。これは、 "group columnsの混在" mysqlエラーが原因です。最後のクエリ($ allValues)を参照してください。冗長性について頭を上げてくれてありがとう。 – Awemo

+0

@Awemoあなたは私たちにあなたのMySQLバージョンを教えていただけますか?それは5.xですか? – yadutaf

+0

バージョン5.051aを使用しています。 – Awemo

関連する問題