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

Consulta SQL buscador con fitros

Estas en el tema de Consulta SQL buscador con fitros en el foro de Bases de Datos General en Foros del Web. Hola a todos. Estoy intentando realizar un buscador en PHP+SQL con filtros. Estoy elaborando la consulta que me saque los totales de todos los filtros ...
  #1 (permalink)  
Antiguo 15/10/2015, 09:38
 
Fecha de Ingreso: junio-2015
Mensajes: 5
Antigüedad: 8 años, 11 meses
Puntos: 0
Consulta SQL buscador con fitros

Hola a todos.

Estoy intentando realizar un buscador en PHP+SQL con filtros. Estoy elaborando la consulta que me saque los totales de todos los filtros de un golpe, pero esta consulta me tarda una eternidad.

¿Alguien conoce algún método más eficaz para realizarlo?

Esta es la mega consulta:

Código SQL:
Ver original
  1. SELECT COUNT(*) AS total_sacados, SUM(CASE WHEN fecha >=1444317968 THEN 1 ELSE 0
  2. END) AS fecha_7, SUM(CASE WHEN fecha >=1442330768 THEN 1 ELSE 0 END) AS fecha_30, SUM(CASE WHEN
  3. fecha >=1429370768 THEN 1 ELSE 0 END) AS fecha_180, SUM(CASE WHEN fecha >=1413386768 THEN 1 ELSE
  4. 0 END) AS fecha_365, SUM(CASE WHEN fecha >=1381850768 THEN 1 ELSE 0 END) AS fecha_730, SUM(CASE
  5. WHEN usuarios.nacimiento < 877274768 AND usuarios.nacimiento >= 719594768 THEN 1 ELSE 0 END) AS
  6. nacimiento0, SUM(CASE WHEN usuarios.nacimiento < 719594768 AND usuarios.nacimiento >= 593450768
  7. THEN 1 ELSE 0 END) AS nacimiento1 , SUM(CASE WHEN usuarios.nacimiento < 593450768 AND
  8. usuarios.nacimiento >= 467306768 THEN 1 ELSE 0 END) AS nacimiento2 , SUM(CASE WHEN
  9. usuarios.nacimiento < 467306768 AND usuarios.nacimiento >= 278090768 THEN 1 ELSE 0 END) AS
  10. nacimiento3 , SUM(CASE WHEN usuarios.nacimiento < 278090768 AND usuarios.nacimiento >= 88874768
  11. THEN 1 ELSE 0 END) AS nacimiento4 , SUM(CASE WHEN usuarios.nacimiento < 88874768 THEN 1 ELSE 0 END) AS
  12. nacimiento5 , SUM(CASE WHEN datos.experiencia >= 0 AND datos.experiencia < (2*365) THEN 1 ELSE 0 END)
  13. AS experiencia0 , SUM(CASE WHEN datos.experiencia >= (2*365) AND datos.experiencia < (4*365) THEN 1
  14. ELSE 0 END) AS experiencia1 , SUM(CASE WHEN datos.experiencia >= (4*365) AND datos.experiencia <
  15. (6*365) THEN 1 ELSE 0 END) AS experiencia2 , SUM(CASE WHEN datos.experiencia >= (6*365) AND
  16. datos.experiencia < (11*365) THEN 1 ELSE 0 END) AS experiencia3 , SUM(CASE WHEN datos.experiencia >=
  17. (11*365) AND datos.experiencia < (16*365) THEN 1 ELSE 0 END) AS experiencia4 , SUM(CASE WHEN
  18. datos.experiencia >= (16*365) THEN 1 ELSE 0 END) AS experiencia5 , SUM(CASE WHEN estudi=14 THEN 1 ELSE
  19. 0 END) AS estudios_14 , SUM(CASE WHEN estudi=3 THEN 1 ELSE 0 END) AS estudios_3 , SUM(CASE WHEN
  20. estudi=5 THEN 1 ELSE 0 END) AS estudios_5 , SUM(CASE WHEN estudi=4 THEN 1 ELSE 0 END) AS estudios_4 ,
  21. SUM(CASE WHEN estudi=6 THEN 1 ELSE 0 END) AS estudios_6 , SUM(CASE WHEN estudi=7 THEN 1 ELSE 0 END)
  22. AS estudios_7 , SUM(CASE WHEN estudi=2 THEN 1 ELSE 0 END) AS estudios_2 , SUM(CASE WHEN estudi=15
  23. THEN 1 ELSE 0 END) AS estudios_15 , SUM(CASE WHEN estudi=8 THEN 1 ELSE 0 END) AS estudios_8 , SUM(CASE
  24. WHEN estudi=1 THEN 1 ELSE 0 END) AS estudios_1 , SUM(CASE WHEN estudi=16 THEN 1 ELSE 0 END) AS
  25. estudios_16 , SUM(CASE WHEN estudi=10 THEN 1 ELSE 0 END) AS estudios_10 , SUM(CASE WHEN estudi=9
  26. THEN 1 ELSE 0 END) AS estudios_9 , SUM(CASE WHEN estudi=12 THEN 1 ELSE 0 END) AS estudios_12 ,
  27. SUM(CASE WHEN estudi=13 THEN 1 ELSE 0 END) AS estudios_13 , SUM(CASE WHEN estudi=17 THEN 1 ELSE 0
  28. END) AS estudios_17 , SUM(CASE WHEN estudi=18 THEN 1 ELSE 0 END) AS estudios_18 , SUM(CASE WHEN
  29. especialidad LIKE '%,45,%' THEN 1 ELSE 0 END) AS funcion_45 , SUM(CASE WHEN especialidad LIKE '%,50,%'
  30. THEN 1 ELSE 0 END) AS funcion_50 , SUM(CASE WHEN especialidad LIKE '%,32,%' THEN 1 ELSE 0 END) AS
  31. funcion_32 , SUM(CASE WHEN especialidad LIKE '%,37,%' THEN 1 ELSE 0 END) AS funcion_37 , SUM(CASE WHEN
  32. especialidad LIKE '%,51,%' THEN 1 ELSE 0 END) AS funcion_51 , SUM(CASE WHEN especialidad LIKE '%,30,%'
  33. THEN 1 ELSE 0 END) AS funcion_30 , SUM(CASE WHEN especialidad LIKE '%,29,%' THEN 1 ELSE 0 END) AS
  34. funcion_29 , SUM(CASE WHEN especialidad LIKE '%,28,%' THEN 1 ELSE 0 END) AS funcion_28 , SUM(CASE WHEN
  35. especialidad LIKE '%,27,%' THEN 1 ELSE 0 END) AS funcion_27 , SUM(CASE WHEN especialidad LIKE '%,24,%'
  36. THEN 1 ELSE 0 END) AS funcion_24 , SUM(CASE WHEN especialidad LIKE '%,21,%' THEN 1 ELSE 0 END) AS
  37. funcion_21 , SUM(CASE WHEN especialidad LIKE '%,19,%' THEN 1 ELSE 0 END) AS funcion_19 , SUM(CASE WHEN
  38. especialidad LIKE '%,18,%' THEN 1 ELSE 0 END) AS funcion_18 , SUM(CASE WHEN especialidad LIKE '%,25,%'
  39. THEN 1 ELSE 0 END) AS funcion_25 , SUM(CASE WHEN especialidad LIKE '%,38,%' THEN 1 ELSE 0 END) AS
  40. funcion_38 , SUM(CASE WHEN especialidad LIKE '%,46,%' THEN 1 ELSE 0 END) AS funcion_46 , SUM(CASE WHEN
  41. especialidad LIKE '%,12,%' THEN 1 ELSE 0 END) AS funcion_12 , SUM(CASE WHEN especialidad LIKE '%,47,%'
  42. THEN 1 ELSE 0 END) AS funcion_47 , SUM(CASE WHEN especialidad LIKE '%,39,%' THEN 1 ELSE 0 END) AS
  43. funcion_39 , SUM(CASE WHEN especialidad LIKE '%,40,%' THEN 1 ELSE 0 END) AS funcion_40 , SUM(CASE WHEN
  44. especialidad LIKE '%,48,%' THEN 1 ELSE 0 END) AS funcion_48 , SUM(CASE WHEN especialidad LIKE '%,9,%'
  45. THEN 1 ELSE 0 END) AS funcion_9 , SUM(CASE WHEN especialidad LIKE '%,8,%' THEN 1 ELSE 0 END) AS funcion_8
  46. , SUM(CASE WHEN especialidad LIKE '%,41,%' THEN 1 ELSE 0 END) AS funcion_41 , SUM(CASE WHEN
  47. especialidad LIKE '%,49,%' THEN 1 ELSE 0 END) AS funcion_49 , SUM(CASE WHEN especialidad LIKE '%,42,%'
  48. THEN 1 ELSE 0 END) AS funcion_42 , SUM(CASE WHEN especialidad LIKE '%,43,%' THEN 1 ELSE 0 END) AS
  49. funcion_43 , SUM(CASE WHEN especialidad LIKE '%,3,%' THEN 1 ELSE 0 END) AS funcion_3 , SUM(CASE WHEN
  50. especialidad LIKE '%,2,%' THEN 1 ELSE 0 END) AS funcion_2 , SUM(CASE WHEN especialidad LIKE '%,44,%' THEN
  51. 1 ELSE 0 END) AS funcion_44 , SUM(CASE WHEN situacion = 0 THEN 1 ELSE 0 END) AS situacion0 , SUM(CASE
  52. WHEN situacion = 1 THEN 1 ELSE 0 END) AS situacion1 , SUM(CASE WHEN situacion = 2 THEN 1 ELSE 0 END) AS
  53. situacion2 , SUM(CASE WHEN situacion = 3 THEN 1 ELSE 0 END) AS situacion3 , SUM(CASE WHEN contra = 1
  54. THEN 1 ELSE 0 END) AS contra_1 , SUM(CASE WHEN contra = 2 THEN 1 ELSE 0 END) AS contra_2 , SUM(CASE
  55. WHEN contra = 3 THEN 1 ELSE 0 END) AS contra_3 , SUM(CASE WHEN contra = 4 THEN 1 ELSE 0 END) AS
  56. contra_4 , SUM(CASE WHEN contra = 5 THEN 1 ELSE 0 END) AS contra_5 , SUM(CASE WHEN contra = 6 THEN 1
  57. ELSE 0 END) AS contra_6 , SUM(CASE WHEN contra = 7 THEN 1 ELSE 0 END) AS contra_7 , SUM(CASE WHEN
  58. dispo = 'si' THEN 1 ELSE 0 END) AS dispo_si , SUM(CASE WHEN dispo = 'no' THEN 1 ELSE 0 END) AS dispo_no
  59. FROM datos (nolock), usuarios (nolock) WHERE usuarios.id=datos.id AND CONTAINS (texto_completo,'pepito')

Muchas gracias!

Última edición por gnzsoloyo; 15/10/2015 a las 10:18
  #2 (permalink)  
Antiguo 15/10/2015, 09:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL buscador con fitros

Primero tienes demasiados likes dentro de la consulta, segundo tienes un campo de full text en el where, tercero estas haciando joins implicitos en lugar de explicitos, y ahora la pregunta del millon, cual es el plan de ejecucion de esa cosa, que indices tienes, en donde tienes los indices? un metodo mejor, podria existir pero sin saber cuales son los datos de entrada ni cual es la salida esta dsificil poder contestar a esa pregunta.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 15/10/2015, 09:50
 
Fecha de Ingreso: junio-2015
Mensajes: 5
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Consulta SQL buscador con fitros

Lo primero muchas gracias por contestar tan rápido.

Estoy empezando con SQL y me han encargado esta tarea que me desborda...

¿Cómo puedo quitar tantos Likes? Son todos necesarios.
¿A qué te refieres con los Join implícitos? Estoy muy verde en este tema...

Lo del plan de ejecución... ni idea, no se cómo se hace :(

¿Qué puedo hacer?
  #4 (permalink)  
Antiguo 15/10/2015, 10:09
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL buscador con fitros

Que motor de bases de datos estas usando? join implicitos son cuando haces esto
Código SQL:
Ver original
  1. SELECT * FROM tabla1,tabla2
cuando la best practice dice que tiene que ser
Código SQL:
Ver original
  1. SELECT * FROM tabla1
  2. INNER JOIN tabla2 ON (tabla1.id=tabla2.id)

si estas usando sql server, ejecuta tu query con CTRL+L

Otra pregunta, porque el nolock? sabes para que se usa?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 15/10/2015, 10:18
 
Fecha de Ingreso: junio-2015
Mensajes: 5
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Consulta SQL buscador con fitros

Estoy usando SQL Server 2008.

Ya entiendo lo de los Join implícitos, voy a probar con INNER JOIN

Lo del (nolock) no estoy seguro, pero según me han dicho evita que se bloqueen las tablas si están siendo usadas a la vez por muchas consultas.
  #6 (permalink)  
Antiguo 15/10/2015, 10:30
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL buscador con fitros

Entonces si puedes ver el plan de ejecucion con ctrl+L, sobre los nolocks, si se usan para evitar interbloqueos cuando se consultan las tablas varias veces, pero es una mala practica usarlos en todos las(se hizo muy comun el que dijeran que era un boton de "turbo" para los queries) revisa este link:

http://blogs.sqlsentry.com/aaronbert...ck-everywhere/

Ahora no has respondido, que indices tiene tu tabla, tiene indices?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 16/10/2015, 00:47
 
Fecha de Ingreso: junio-2015
Mensajes: 5
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Consulta SQL buscador con fitros

La tabla "datos" tiene un índice en el campo "texto_completo", y la tabla "usuarios" en un campo "nombre" que no lo uso en esta consulta
  #8 (permalink)  
Antiguo 18/10/2015, 18:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL buscador con fitros

y el indice de la tabla usuarios es cluster o noncluster?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: buscador, select, sql
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 16:41.