2012-07-09 13 views
6

Estoy intentando crear una función de búsqueda para un sitio cakephp y mysql. Al seleccionar diferentes parámetros, como el precio del producto o la longitud, se activa una llamada ajax que devuelve el número de resultados coincidentes. Quiero extender los resultados devueltos con los valores mínimos y máximos para las longitudes y los precios. Intenté hacer esto, http://bin.cakephp.org/view/1004813660. Usar los primeros 4 hallazgos consume demasiado tiempo. El último funciona localmente, pero obtengo el error;Mínimo y máximo de un campo en cakephp y mysql

1140 - Mezcla de columnas GROUP (MIN(), MAX() ,, ...) sin columnas grupo es ilegal si no hay GROUP BY clause`

forma remota, debido a estar en ONLY_FULL_GROUP_BY.

¿Es posible utilizar la última opción con algunas mejoras o puedo desactivar ONLY_FULL_GROUP_BY?

Respuesta

0

Terminé resolviendo el problema cambiando la forma en que estaba buscando. En lugar de hacer consultas en las condiciones que conducirían a las uniones, explícitamente hice la búsqueda con where.Tenía cosas por el estilo,

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

el que lo sustituyó con

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

que tenía que reestructurar la base de datos un poco, pero el equilibrio entre la velocidad y la normalización de bases de datos es que puedo vivir.

1

La manera de establecer modos de servidor se puede encontrar aquí ... Si usted lee la parte superior del documento que le dirá cómo configurar los valores por defecto el modo de servidor:

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

Sin embargo, I' No estoy seguro de que sea necesario para llegar a su solución. Creo que su consulta se está ejecutando durante mucho tiempo porque necesita un grupo diferente en su código y menos consultas. Usted debe ser capaz de utilizar un grupo lógico por el que va a maximizar su clave primaria (índice):

'group' => 'Yacht.id' 

Así que tienes una consulta devolver todo:

$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

Echaré un vistazo a apagar el sql_mode. Sin embargo, he intentado agruparme. Sin embargo, debido al hecho de que se devuelve el primer resultado, me dará solo el resultado con respecto a lo que defino en orden por. Por ejemplo, si ordeno por Yacht.price ASC, da toda la fila que corresponde al precio mínimo posible. Los otros parámetros no son el resultado esperado. – Awemo

2

Si he entendido bien, usted quiere para conseguir en una sola petición

  • MIN (Yacht.price) como MIN_PRICE
  • MAX (Yacht.price) como MAX_PRICE
  • MIN (Yacht.long) como min_length
  • MAX (Yacht.long) como max_length

¿verdad?

Para esto, no necesita ninguna cláusula "Agrupar por". Las funciones MIN y MAX ya son funciones de agregación. Pero nada le impide usar múltiples funciones de agregaciones en una única solicitud.

¿Has intentado simplemente hacer esto?

$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' 
    ) 
    ) 
); 

Por cierto, de acuerdo con el documentation, parece que hay un buen montón de redundancia en el código original. "find ('first', array (...))" por sí solo garantiza que obtendrá un solo resultado, por lo tanto, no es necesario especificar "'limit' => 1" en la solicitud ni la cláusula "order" ya que ser solo un campo de todos modos :)

Espero que ayude.

+0

Lo intenté. Pero mientras funciona en el sitio local, no en el sitio remoto. Esto se debe al error de "mezcla de columnas de grupo" de mysql. Ver la última consulta ($ allValues). Gracias por la información sobre la redundancia. – Awemo

+0

@Awemo ¿nos puede dar su versión de MySQL? ¿Eso es 5.x? – yadutaf

+0

Estoy usando la versión 5.051a. – Awemo

Cuestiones relacionadas