como y no como en una consulta de MySQL
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
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