2009-06-15 2 views
17

Ich möchte eine Abfrage mit "Like" und "Nicht wie".Like und nicht wie in einer MySQL-Abfrage

Aktuelles Beispiel: Ich möchte alles mit '1 |%' beginnen, aber nicht mit '1 | 6 | 199 |%' oder '1 | 6 | 200 |%'.

Aktuelle Abfrage:

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

Aber das funktioniert nicht. Irgendwelche Tipps? thx

+1

"Funktioniert nicht" sollte etwas genauer sein. Ich nehme an, Sie bekommen einen Syntaxfehler - in diesem Fall hat Michael Haren Ihre Lösung. –

Antwort

29

Fügen Sie einfach „und der Kategorie“ ...

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

Eigentlich ist das Komma getrennten Zustand ist keine Syntax ich kenne. Wenn das nicht funktioniert, versuchen Sie stattdessen:

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

Danke! es funktionierte! Was ist jedoch falsch mit dem Folgenden? SELECT * FROM 'Links' WHERE' Kategorie' LIKE '1 | 6 |%' UND 'Kategorie' NICHT WIE '1 | 6 | 137 |%', '1 | 6 | 151 |%', '1 | 6 | 118 |% ',' 1 | 6 | 176 |% ',' 1 | 6 | 67 |% ',' 1 | 6 | 199 |% ',' 1 | 6 | 160 |% 'ORDER BY' Punktestand ' DESC LIMIT 9 ? es zeigt leer, aber es ist nicht thx! –

+0

Wenn Sie mehrere Ausschlüsse durchführen möchten, empfehle ich Ihnen, SUBSTR (Kategorie, 1, 8) NOT IN (1 | 6 | 137 | ',' 1 | 6 | 151 | ', ...) zu verwenden. –

3

Sie regexps verwenden können:

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

Beachten Sie, dass REGEXP ‚s verwenden keine Indizes, während LIKE tut.

In dieser Abfrage wird LIKE '1|%' als Grobfilter mit dem Index auf category falls vorhanden dienen, während REGEXP wird die Ergebnisse fein filtern.

2

Ich denke, ein größeres Problem ist, dass Sie Tabellen de-normalisiert haben. Die richtige Antwort wäre, Ihre Tabellen zu normalisieren.

Aber wenn Sie das nicht tun können, sollten Sie Kommas als Trennzeichen und FIND_IN_SET() statt:

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

Es ist auch möglich, zwei innere Verknüpfung, wahrscheinlich nicht die beste Lösung für diese Abfrage, aber könnte immer noch nützlich sein.

SELECT * FROM Links

INNER JOIN (SELECT * FROM Links WHERE Kategorie '1 | 6 | 199 |%' NOT LIKE) AS escl1 ON (links.category = escl1.category)

INNER JOIN (SELECT FROM Links * WHERE Kategorie '1 | 6 | 200 |%' NOT LIKE) AS escl2 ON (links.category = escl2.category)

WHERE Kategorie LIKE '1 |%'

ORDER BY score DESC LIMIT 9