Pregunta

Quiero hacer una consulta que contenga 'como' y 'no como'.

ejemplo actual: quiero todo lo que empieza con '1 |%' pero no con '1 | 6 | 199 |%' o '1 | 6 | 200 |%'

.

Consulta actual:

'SELECT * FROM `links` WHERE `category` LIKE '1|%' NOT LIKE '1|6|199|%','1|6|200|%' ORDER BY `score` DESC LIMIT 9'.

Pero eso no funciona. ¿Algun consejo? THX

¿Fue útil?

Solución

Sólo tiene que añadir "y la categoría" ...

SELECT * FROM links 
WHERE category LIKE '1|%' 
  AND category NOT LIKE '1|6|199|%','1|6|200|%' 
ORDER BY score DESC LIMIT 9

En realidad, la condición separada por comas no es una sintaxis que estoy familiarizado. Si eso no es trabajar, probar este lugar:

SELECT * FROM links 
WHERE category LIKE '1|%' 
  AND category NOT LIKE '1|6|199|%'
  AND category NOT LIKE '1|6|200|%' 
ORDER BY score DESC LIMIT 9

Otros consejos

Puede utilizar regexps:

SELECT  *
FROM    links 
WHERE   category LIKE '1|%' 
        AND category NOT REGEXP '^1\\|6\\|(199|200)\\|'
ORDER BY
        score DESC
LIMIT 9

Tenga en cuenta que de REGEXP no utilizan índices, mientras que LIKE hace.

En esta consulta, LIKE '1|%' servirá como un filtro grueso usando el índice de category en su caso, mientras que se REGEXP filtro fino de los resultados.

Creo que un problema más grande es que usted tiene tablas desnormalizada. La respuesta correcta sería la de normalizar las tablas.

Sin embargo, si usted no puede hacer eso, usted debe utilizar comas como separadores y FIND_IN_SET() lugar:

WHERE FIND_IN_SET('1', category) > 1
  AND FIND_IN_SET('6', category) > 1
  AND FIND_IN_SET('199', category) = 0
  AND FIND_IN_SET('200', category) = 0

También es posible utilizar dos se unen interior, probablemente no es la mejor solución para esta consulta, pero aún podría ser útil.

  

SELECT * FROM enlaces

     

INNER JOIN (SELECT * FROM enlaces donde la categoría NOT LIKE '1 | 6 | 199 |%') COMO EN escl1 (links.category = escl1.category)

     

INNER JOIN (SELECT * FROM enlaces donde la categoría NOT LIKE '1 | 6 | 200 |%') COMO EN escl2 (links.category = escl2.category)

     

DONDE categoría como '1 |%'

     

ORDER BY LIMIT score DESC 9

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top