2009-06-15 13 views
17

Quiero hacer una consulta que contenga 'me gusta' y 'no me gusta'.me gusta y no me gusta en una consulta mysql

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

+1

"no funciona" debe ser un poco más preciso. Supongo que obtienes un error de sintaxis, en cuyo caso Michael Haren tiene tu solución. –

Respuesta

29

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 coma separa condición 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 
+0

thx! ¡funcionó! Sin embargo, ¿qué pasa con lo siguiente? SELECT * FROM '' links' category' GUSTO DONDE '1 | 6 |%' y 'NO category' como '1 | 6 | 137 |%', '1 | 6 | 151 |%', '1 | 6 | 118 |% ',' 1 | 6 | 176 |% ',' 1 | 6 | 67 |% ',' 1 | 6 | 199 |% ',' 1 | 6 | 160 |% 'ORDER BY 'puntuación' DESC LIMITE 9 ? se muestra vacío, pero no es thx! –

+0

si desea realizar varias exclusiones, le sugiero que utilice SUBSTR (categoría, 1, 8) NOT IN (1 | 6 | 137 | ',' 1 | 6 | 151 | ', ...). –

3

Usted 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 REGEXP 's no utilizan índices, mientras que LIKE hace.

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

2

Creo que un problema mayor es que tiene tablas des-normalizadas. La respuesta correcta sería normalizar sus tablas.

Pero 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 
0

También es posible utilizar dos se unen interior, probablemente no es la mejor solución para esta consulta, pero 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 |%'

PEDIDO POR score DESC LIMIT 9

Cuestiones relacionadas