Foros del Web » Programando para Internet » PHP »

PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Estas en el tema de PAGINATOR y ORDER BY [puntuacion] no van bien juntos en el foro de PHP en Foros del Web. Estoy instalando el tipico buscador, que difiere entre palabras simple y múltiples palabras: Cita: // cuento numero de palabras $trozos=explode(" ",$search); $numero=count($trozos); if ($numero==1) { ...
  #1 (permalink)  
Antiguo 10/05/2010, 18:20
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Estoy instalando el tipico buscador, que difiere entre palabras simple y múltiples palabras:

Cita:
// cuento numero de palabras
$trozos=explode(" ",$search);
$numero=count($trozos);


if ($numero==1) {
// only one word
$_pagi_sql= "SELECT DISTINCT* FROM manual_contents WHERE sections LIKE '%$search%' AND language = '$language'";
}
elseif ($numero>1) {
// more than one: a phrase.
$_pagi_sql = "SELECT chapter_id,page_id,section_id,sections, MATCH(sections) AGAINST ('$search' IN BOOLEAN MODE) AS score FROM manual_contents WHERE MATCH (sections) AGAINST ('$search' IN BOOLEAN MODE) AND language = '$language' ORDER BY score DESC";
};
El problema es que al paginar usando el PAGINATOR entra en conflicto la sentencia ORDER BY [puntuacion]. El error es este:

Cita:
Error en la consulta de conteo de registros: SELECT COUNT(*) FROM manual_contents WHERE MATCH (sections) AGAINST ('animation track' IN BOOLEAN MODE) AND language = 'en' ORDER BY score DESC. Mysql dijo: Unknown column 'score' in 'order clause'
Se que de alguna u otra manera este tema ya fue tratado en el foro. Pero no encuentro solución. También estuve leyendo esto que es un chateo en donde no han encontrado solución clara.

Pero espero que alguien sepa la solución. Gracias!.

Última edición por mayid; 10/05/2010 a las 18:25
  #2 (permalink)  
Antiguo 10/05/2010, 18:22
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 21 años
Puntos: 89
Respuesta: PAGINATOR y ORDER BY no van bien juntos

El error solo dice que no existe la columna score :/
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #3 (permalink)  
Antiguo 10/05/2010, 18:34
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Claro, pero la columna score es la que da relevancia a la busqueda.

Curiosamente, traslade el ORDER BY hacia adentro del paginator, modificando esta linea:

$_pagi_sqlLim = $_pagi_sql." LIMIT $_pagi_inicial,$_pagi_cuantos ";

y dejandola así:

$_pagi_sqlLim = $_pagi_sql." ORDER BY score DESC LIMIT $_pagi_inicial,$_pagi_cuantos ";

Y funciona.

Eso del order by está presente en algunos buscadores. Al parecer optimiza las busquedas y por eso quiero conservarlo.

Ya esta resuelto ahora.
  #4 (permalink)  
Antiguo 11/05/2010, 14:37
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

No estaba resuelto! Al menos no para la busqueda de palabras unicas.

Si pongo ORDER BY dentro de la clase, funciona para palabras multiples. Pero poniendo eso, también se le agrega ORDER BY a las busquedas simples:

Cita:
if ($numero==1) {
// only one word
$_pagi_sql= "SELECT DISTINCT * FROM manual_contents as score WHERE sections LIKE '%$search%' AND language = '$language'";
}
Así que tendré que prescindir de ORDER BY, a menos que a alguien se le ocurre por que no funciona por fuera de la clase. :\
  #5 (permalink)  
Antiguo 11/05/2010, 14:58
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Pues si... creo que debe ser cosa del paginator porque yo también aplique éste query a mi buscador pero tuve que quitarle el order by porque tampoco me reconocía el campo "puntuacion"

Código PHP:

$_pagi_sql
="SELECT DISTINCT a.id, titulo, descripcion, autor MATCH (titulo,descripcion,autor) AGAINST ('%".$busqueda."%' IN BOOLEAN MODE ) AS puntuacion FROM libro a INNER JOIN tags b ON a.id=b.id WHERE MATCH (titulo,descripcion,autor) AGAINST ('%".$busqueda."%' IN BOOLEAN MODE) OR MATCH (tags_descripcion) AGAINST ('%".$busqueda."%' IN BOOLEAN MODE)"
__________________
Quitenme la vida pero no la bebida.
  #6 (permalink)  
Antiguo 11/05/2010, 16:53
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Estoy seguro de que poner o no poner ORDER BY hace la diferencia. Los resultados son distintos. Pero no puedo asegurar que sean mejores ( más relevantes ) los que tienen order by.
  #7 (permalink)  
Antiguo 11/05/2010, 21:06
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

En un SELECT COUNT(*) no necesitas ORDER BY porque solo vas a contar cuantos registros cumplen la condicion, independientemente del orden que apliques al paginar y, en ese caso, tendrias que usar un alias para el campo, no para la tabla.

Cita:
$_pagi_sql= "SELECT DISTINCT * FROM manual_contents as score WHERE sections LIKE '%$search%' AND language = '$language'";
En este caso estas usando el alias score para la tabla manual_contents y la consulta original estaba correcta, solo le faltaba el LIMIT

Cita:
// Primero cuentas, calculas inicio y registros a leer
// Aqui iria el SELECT COUNT(*)....

// Despues lees la pagina a mostrar:
$_pagi_sql = "SELECT chapter_id,page_id,section_id,sections, MATCH(sections) AGAINST ('$search' IN BOOLEAN MODE) AS score FROM manual_contents WHERE MATCH (sections) AGAINST ('$search' IN BOOLEAN MODE) AND language = '$language' ORDER BY score DESC LIMIT $inicio, $registros";
Si vas a mostrar primero los resultados mas relevantes, puedes omitir el ORDER BY, pero si vas en orden inverso, entonces si lo necesitas, a sabiendas de que el tiempo de proceso sera mayor.

Mas info para optimizacion de busquedas (en ingles): http://www.mysqlperformanceblog.com/...-optimization/
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 12/05/2010, 09:45
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: PAGINATOR y ORDER BY [puntuacion] no van bien juntos

Gracias Triby!

Aclaro que se me escapo esto: manual_contents as score cuando estaba probando soluciones ( a ciegas ). Pero era solo una prueba.

Voy a prescindir del ORDER BY en casos de palabras sueltas o multiples.

Gracias por el link.

Etiquetas: order, paginator, puntuacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.