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