webentwicklung-frage-antwort-db.com.de

wie und nicht wie in einer MySQL-Abfrage

Ich möchte eine Abfrage mit "Gefällt mir" und "Nicht mögen" machen.

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'.

Das geht aber nicht. Irgendwelche Tipps? Vielen Dank

18
Maurice Kroon

Fügen Sie einfach "und Kategorie" hinzu ...

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 die durch Kommas getrennte Bedingung keine mir bekannte Syntax. Wenn das nicht funktioniert, versuchen Sie es 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
30
Michael Haren

Sie können regexps verwenden:

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 keine Indizes verwendet, während LIKE dies tut.

In dieser Abfrage wird LIKE '1|%' als Grobfilter verwendet, wenn der Index für category verwendet wird, während REGEXP die Ergebnisse fein filtert.

3
Quassnoi

Ich denke, ein größeres Problem besteht darin, dass Sie Tabellen deaktiviert haben. Die richtige Antwort wäre, Ihre Tabellen zu normalisieren.

Wenn Sie das nicht können, sollten Sie stattdessen Kommas als Trennzeichen und FIND_IN_SET() verwenden:

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
2
longneck

Es ist auch möglich, zwei innere Verknüpfungen zu verwenden, die wahrscheinlich nicht die beste Lösung für diese Abfrage sind, aber dennoch nützlich sein könnten.

SELECT * FROM-Links

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

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

WO Kategorie wie '1 |%'

ORDER BY score DESC LIMIT 9

0
Ash