como e não como em uma consulta mysql
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
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