2010-07-20 19 views
7

Ayúdenme a crear una consulta de selección que contenga 10 cláusula 'where' y la orden debe ser así: los resultados deben mostrarse en orden de la mayoría de las palabras clave (donde las condiciones) coinciden hasta el mínimo emparejadoOrdenar por condición máxima coincidencia

NOTA: todas las 10 condiciones son con "O".

Ayúdenme a crear esta consulta. estoy usando MS-SQL Server 2005

igual:

Select * 
    from employee 
where empid in (1,2,4,332,434) 
    or empname like 'raj%' 
    or city = 'jodhpur' 
    or salary >5000 

En consulta anterior todos aquellos registro que coincide con las máximas condiciones deben estar en la cima y menos coincidente condición de registro debe ser en la parte inferior.

+0

¿Puede dar un ejemplo de la consulta que está utilizando? –

+0

Algún esquema de muestra sería útil. –

Respuesta

12
SELECT * 
    FROM (SELECT (CASE WHEN cond1 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       ... 
       CASE WHEN cond10 THEN 1 ELSE 0 END 
       ) AS numMatches, 
       other_columns... 
      FROM mytable 
     ) xxx 
WHERE numMatches > 0 
ORDER BY numMatches DESC 
+0

Eso funciona muy bien también. – Tobiasopdenbrouw

+0

se ve muy bien, no tengo ni idea de cómo hacer esto con doctrine + symfony: D –

+0

Esto debe estar en los libros de texto de SQL. –

2

EDITAR: Esta respuesta se publicó antes de que la pregunta se modificara con un ejemplo concreto. Marcelo's solution aborda el problema real. Por otro lado, mi respuesta fue dar prioridad a las coincidencias de campos específicos.


Es posible que desee probar algo como lo siguiente, usando las mismas expresiones en la cláusula ORDER BY como en su cláusula WHERE:

SELECT * 
FROM  your_table 
WHERE  field_1 = 100 OR 
      field_2 = 200 OR 
      field_3 = 300 
ORDER BY field_1 = 100 DESC, 
      field_2 = 200 DESC, 
      field_3 = 300 DESC; 

He respondido recientemente una pregunta similar en el que el desbordamiento de pila que podría estar interesado en probar:

+0

Esto no ordena de acuerdo con el número de coincidencias. –

+0

Sí, es cierto. No estaba claro en la pregunta original ... Estoy tratando de ver si puedo adaptar mi respuesta. –

0

Hay muchas opciones/respuestas posibles. Mejor respuesta depende del tamaño de los datos, requisitos no funcionales, etc.

Dicho esto, lo que haría es algo como esto (fácil de leer/debug):

Select * from 
    (Select *, iif(condition1 = bla, 1, 0) as match1, ..... , match1+match2...+match10 as totalmatchscore from sourcetable 
    where 
     condition1 = bla or 
     condition2 = bla2 
     ....) as helperquery 
    order by helperquery.totalmatchscore desc 
+1

Usa la solución de Marcelo. – Tobiasopdenbrouw

0

no pude conseguir esto para trabajar para mí en Oracle. Si usa Oracle, este Order by Maximum condition match es una buena solución. Utiliza el caso cuando la característica de idioma