Pergunta

Eu quero fazer uma consulta contendo 'como' e 'não gosto'.

exemplo atual:. Eu quero tudo começando com '1 |%', mas não com '1 | 6 | 199 |%' ou '1 | 6 | 200 |%'

consulta atual:

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

Mas isso não funciona. Alguma dica? thx

Foi útil?

Solução

Basta adicionar "e categoria" ...

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

Na verdade, a condição de separados por vírgula não é uma sintaxe que estou familiarizado. Se isso não funcionar, tente isso em vez disso:

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

Outras dicas

Você pode usar regexps:

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

Nota daquele REGEXP não utilizam índices, enquanto LIKE faz.

Nesta consulta, LIKE '1|%' servirá como um filtro grosso usando o índice em category se houver, enquanto filtro fino do REGEXP os resultados.

Eu acho que um problema maior é que você tem tabelas de-normalizado. A resposta correta seria para normalizar suas tabelas.

Mas se você não pode fazer isso, você deve usar vírgulas como separadores e FIND_IN_SET() vez:

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

Também é possível usar dois junção interna, provavelmente não a melhor solução para esta consulta, mas ainda pode ser útil.

* SELECT FROM ligações

INNER JOIN (SELECT * FROM links onde categoria não gosto '1 | 6 | 199 |%') AS escl1 ON (links.category = escl1.category)

INNER JOIN (SELECT * FROM links onde categoria não gosto '1 | 6 | 200 |%') AS escl2 ON (links.category = escl2.category)

WHERE categoria LIKE '1 |%'

ORDER BY score DESC LIMIT 9

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top