Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Criterios de ordenación

Estas en el tema de Criterios de ordenación en el foro de Bases de Datos General en Foros del Web. Hola amigos, De SQL se lo básico y ahora tengo que hacer una consulta un poco mas elaborada, por eso acudo a los expertos. Se ...
  #1 (permalink)  
Antiguo 20/02/2010, 09:38
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Criterios de ordenación

Hola amigos,

De SQL se lo básico y ahora tengo que hacer una consulta un poco mas elaborada, por eso acudo a los expertos. Se trata de hacer una consulta ordenada según los criterios que voy a exponer a continuación.

Código PHP:
$busqueda 'tecnologia'
1. Coincidencias en el campo TITULO
1.1 Si tiene la palabra "k2k" en el TITULO --> COGERLOS Y ORDENAR DE MAYOR A MENOR CARACTERES DEL CAMPO DESCRIPCION
1.2 Si NO tiene la palabra "k2k" en el TITULO --> COGERLOS Y ORDENAR DE MAYOR A MENOR CARACTERES DEL CAMPO DESCRIPCION

2. Coincidencias en el campo DESCRIPCION
2.1 Si tiene la palabra "k2k" en el TITULO --> COGERLOS Y ORDENAR DE MAYOR A MENOR CARACTERES DEL CAMPO DESCRIPCION
2.2 Si NO tiene la palabra "k2k" en el TITULO --> COGERLOS YORDENAR DE MAYOR A MENOR CARACTERES DEL CAMPO DESCRIPCION

Espero vuestras segurencias!

Un saludo.
  #2 (permalink)  
Antiguo 20/02/2010, 11:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

acláranos algo más con ejemplos, pues no acabo de entender toda tu explicación. En el apartado 2, dices lo mismo que en el apartado 1, excepto en lo referido a coincidencias en el campo...
Tampoco aclaras si esas dos subclasificaciones se clasificarán en el mismo orden en que las presentas, es decir, primero los que tienen k2k en el título, y luego los que no lo tienen.
No explicas qué significa ordenar de mayor a menor caracteres: ¿es orden alfabético inverso o por el número de caracteres?
Si es simplemente orden alfabético inverso, bastará con usar UNION ALL y ORDER BY ... DESC
Código MySQL:
Ver original
  1. (SELECT TITULO, DESCRIPCION FROM tutabla WHERE TITULO LIKE '%k2k%' ORDER BY DESCRIPCION DESC)
  2. (SELECT TITULO, DESCRIPCION FROM tutabla WHERE TITULO NOT LIKE  '%k2k%' ORDER BY DESCRIPCION DESC)
  #3 (permalink)  
Antiguo 20/02/2010, 18:06
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

Lo que me refiero es que quiero que encuentre los que encuentre coincidencias de $busqueda en el campo TITULO (where TITULO LIKE '$busqueda'). De los que encuentre que salgan primero los que contienen la palabra "k2k" en el TITULO ordenados de mayor a menor número de caracteres de su campo DESCRIPCION. Y a continuación los que no tienen la palabra "k2k" ordenados de mayor a menor número de caracteres de su campo DESCRIPCION.

El proceso del punto 2 sería idéntico, lo único que cambiaría seria que en vez de buscar la coincidencia de $busqueda en el campo TITULO, lo haría en el campo DESCRIPCION.

Espero que te sirva jurena para hacerte una idea, si tienes alguna duda mas preguntame. a ver si llegamos a buen puerto

Un saludo y gracias por tu tiempo!
  #4 (permalink)  
Antiguo 21/02/2010, 05:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

Una primera prueba a ver qué tal en título

Código MySQL:
Ver original
  1. SELECT TITULO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(DESCRIPCION) ordlongitud
  2.  FROM tutabla
  3.    WHERE TITULO LIKE '%{$busqueda}%'
  4.     ORDER BY ordk2k ASC, ordlongitud DESC

explicación:
busco la cadena de la variable búsqueda en el campo TITULO. Si está, me devuelve todos los registros que cumplen esa condición, y para ordenar usa dos campos calculados; en primer lugar ordena en orden ascendente por ordk2k, en el que si en titulo aparece la cadena k2k escribe 0, y, si no, 1; en segundo lugar ordena de manera descendente por la longitud de caracteres del campo DESCRIPCION.

Última edición por jurena; 21/02/2010 a las 06:31
  #5 (permalink)  
Antiguo 21/02/2010, 14:57
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

Gracias, justo lo que necesitaba.

Por cierto para asignar el campo virtual ordk2k no se tendría que poner un "AS"?

Un saludo!
  #6 (permalink)  
Antiguo 21/02/2010, 15:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

No es obligado, y ni siquiera es estándar ahora. El uso de AS se mantiene sólo por compatibilidad.
  #7 (permalink)  
Antiguo 22/02/2010, 09:01
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

Gracias por la aclaración jurena.

A continuación quiero poner la misma query pero en vez de:
TITULO LIKE '%{$busqueda}%'
con:
DESCRIPCION LIKE '%{$busqueda}%'

Pensé en hacer CONSULTA1 union distinct CONSULTA2, pero en este caso me mezclaría la ordenación si no me equivoco y lo que me interesa es que los de CONSULTA2 (que es el que busca coincidencia en la DESCRIPCION), los ordene justo despues de la CONSULTA1, como bloques separados.

Pensé en hacerlo en dos querys y extraer los datos por separado, pero seguro que hay forma de hacerlo en una solo.

Un saludo y gracias por tus respuestas!
  #8 (permalink)  
Antiguo 22/02/2010, 13:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

puedes usar UNION ALL
pero con eso repetirías algún dato;
con UNION solamente evitarías repeticiones. Pero sería una lista:
Código MySQL:
Ver original
  1. (SELECT TITULO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(DESCRIPCION) ordlongitud
  2.  FROM tutabla
  3.    WHERE TITULO LIKE '%{$busqueda}%'
  4.     ORDER BY ordk2k ASC, ordlongitud DESC
  5. )
  6. (SELECT TITULO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(DESCRIPCION) ordlongitud
  7.  FROM tutabla
  8.    WHERE DESCRIPCION LIKE '%{$busqueda}%'
  9.     ORDER BY ordk2k ASC, ordlongitud DESC
  10. )

No sabemos lo que quieres hacer exactamente con ese listado...
  #9 (permalink)  
Antiguo 22/02/2010, 14:19
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

¿A que te refieres con que sería una lista?

En realidad lo que quiero es que ordene primero el primer select y luego el segundo como bloques independientes, sin que se mezclen los resultados, es decir:

Resultado1 (coincidencia titulo)
Resultado2 (coincidencia titulo)
Resultado3 (coincidencia titulo)
Resultado4 (coincidencia titulo)
----------------------------------------------
Resultado1 (coincidencia descripcion)
Resultado2 (coincidencia descripcion)
Resultado3 (coincidencia descripcion)
Resultado4 (coincidencia descripcion)

Un saludo!
  #10 (permalink)  
Antiguo 22/02/2010, 17:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

Para eso, mejor usar dos consultas separadas y cargar cada una en un array distinto.
  #11 (permalink)  
Antiguo 22/02/2010, 17:52
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

Sip, ya lo había pensado, lo que pasa es que luego tengo un sistema paginador que lo que hace es contar los registros de la consulta SQL y si hago dos consultas ya me lo cargo.

Un saludo!
  #12 (permalink)  
Antiguo 23/02/2010, 04:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

Pues entonces usa un campo de control que te indique el cambio de búsqueda en campo. Bastará con esto
Código MySQL:
Ver original
  1. (SELECT 'TITULO' campobusqueda, TITULO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(DESCRIPCION) ordlongitud
  2.  FROM tutabla
  3.    WHERE TITULO LIKE '%{$busqueda}%'
  4.     ORDER BY ordk2k ASC, ordlongitud DESC
  5. )
  6. (SELECT, 'DESCRIPCION', TITULO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(DESCRIPCION) ordlongitud
  7.  FROM tutabla
  8.    WHERE DESCRIPCION LIKE '%{$busqueda}%'
  9.     ORDER BY ordk2k ASC, ordlongitud DESC
  10. )
Si controlas el paso de ese campobusqueda en la iteración, sabes cuándo se produce el cambio; también puedes cargar en un array y controlarlo mediante ese campo.
  #13 (permalink)  
Antiguo 23/02/2010, 10:01
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

No entiendo muy bien lo que me comentas.

Yo había pensado en crear otro camppo virtual llamado titulodesc (si encuentra en el titulo = 0, si encuentra en la descripcion = 1) y luego hacer la ordenación así:

ORDER BY titulodesc ASC,ordk2k ASC, ordlongitud DESC

¿Esto es posible?

Edito: Al final me ha quedado una consulta asi:

SELECT TITULO,ARCHIVO, IF(INSTR(TITULO,'k2k')>0,0,1) ordk2k, LENGTH(TEXTO) ordlongitud FROM referencias WHERE CATEGORIA='partners' AND MATCH(TITULO,TEXTO) AGAINST ('$buscar') ORDER BY ordk2k ASC, ordlongitud DESC

Pero es lo que te comento, no tengo manera de separar y poner primero los de coincidencia en el TITULO y luego los de coincidencia en el TEXTO.

Edito2: Al final lo he conseguido, poniendo un 'A' AS control en el primer select y luego 'B' AS control en el segundo y hacer un order by alfinal de todo.
Pero me encuentro que cuando me encuentra en los dos selects, me duplica el resultado, porque uno devuelve A y el otro B y entonces ya no son iguales. Me quedo asi la consulta:


Código PHP:
(SELECT TITULO,ARCHIVO,'A' AS titulotexto, IF(INSTR(TITULO,'k2k')>0,0,1) AS ordk2kLENGTH(TEXTO) AS ordlongitud FROM referencias WHERE CATEGORIA='partners' AND MATCH(TITULOAGAINST ('AIDO'))
UNION DISTINCT
(SELECT TITULO,ARCHIVO,'B' AS titulotexto, IF(INSTR(TITULO,'k2k')>0,0,1) AS ordk2kLENGTH(TEXTO) AS ordlongitud FROM referencias WHERE CATEGORIA='partners' AND MATCH(TEXTOAGAINST ('AIDO'))
ORDER BY ordk2k ASCordlongitud DESC 
La desesperación ya es máxima.


Un saludo!

Última edición por urameshix; 24/02/2010 a las 11:45
  #14 (permalink)  
Antiguo 25/02/2010, 01:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Criterios de ordenación

¿Has probado la consulta que te propuse en el post #12?
  #15 (permalink)  
Antiguo 25/02/2010, 03:56
 
Fecha de Ingreso: octubre-2005
Mensajes: 240
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Criterios de ordenación

Gracias jurena, pero ya encontré una solución:

Código PHP:
SELECT tituloarchivo
FROM referencias
WHERE MATCH
(TITULOAGAINST ('$busqueda')
      OR 
MATCH(TEXTOAGAINST ('$busqueda')

ORDER BY if(MATCH(TITULOAGAINST ('$busqueda'), 12), [otros criterios de ordenamiento]; 
Un saludo!

Etiquetas: criterios
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 01:06.