2009-06-15 8 views
17

voglio fare una query che contiene 'come' e 'non come'.come e non come in una query mysql

esempio attuale: voglio tutto che iniziano con '1 |%', ma non con '1 | 6 | 199 |%' o '1 | 6 | 200 |%'.

interrogazione attuale:

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

Ma questo non funziona. Qualche consiglio? thx

+1

"Non funziona" dovrebbe essere un po 'più preciso. Presumo che tu abbia un errore di sintassi - nel qual caso Michael Haren ha la tua soluzione. –

risposta

29

Basta aggiungere "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 

In realtà, il separati da virgola condizione non è una sintassi ho familiarità con. Se questo è non funziona, provate questo invece:

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! ha funzionato! Tuttavia, cosa c'è di sbagliato in quanto segue? SELECT * FROM 'links' dove' category' LIKE '1 | 6 |%' e 'category' NON COME '1 | 6 | 137 |%', '1 | 6 | 151 |%', '1 | 6 | 118 |% ',' 1 | 6 | 176 |% ',' 1 | 6 | 67 |% ',' 1 | 6 | 199 |% ',' 1 | 6 | 160 |% 'ORDINA PER 'punteggio' DESC LIMIT 9 ? mostra vuoto ma non è thx! –

+0

se si desidera eseguire diverse esclusioni, suggerisco di utilizzare SUBSTR (categoria, 1, 8) NOT IN (1 | 6 | 137 | ',' 1 | 6 | 151 | ', ...). –

3

È possibile utilizzare regexps:

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

noti che REGEXP 's non usano gli indici, mentre LIKE fa.

In questa query, LIKE '1|%' fungerà da filtro di massima con l'indice su category se presente, mentre i valori di REGEXP filtreranno bene i risultati.

2

Credo che un problema più grande è che avete le tabelle de-normalizzati. La risposta corretta sarebbe quella di normalizzare le tue tabelle.

Ma se non si può fare, è necessario utilizzare le virgole come separatori e FIND_IN_SET() invece:

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

E 'anche possibile usare due uniscono interno, probabilmente non è la migliore soluzione per questa query, ma potrebbe ancora essere utile

SELECT * FROM link

INNER JOIN (SELECT * FROM link dove categoria NOT LIKE '1 | 6 | 199 |%') AS escl1 ON (links.category = escl1.category)

INNER JOIN (SELECT * FROM link dove categoria NOT LIKE '1 | 6 | 200 |%') AS escl2 ON (links.category = escl2.category)

DOVE categoria LIKE '1 |%'

ORDINARE PER score LIMITE DI DESCRIZIONE 9

Problemi correlati