MySQL: AND/OR in SELECT
KackfohgeI
- datenbank
Hallo,
gegeben ist eine MySQL-DB mit der Tabelle Spieler:
Name | Punkte |
---------------
Tim | 0 |
Tom | 5 |
Ute | 5 |
Uta | 0 |
... | 2 |
Jetzt würde ich gerne alle Namen der Spieler mit mind. 1 Punkt abfragen.
Dies mache ich derzeit wie folgt
$abfrage = "SELECT Name FROM Spieler WHERE (Punkte > 0) AND (Name <> 'Tim') AND (Name <> 'Uta')";
Dies funktioniert soweit ganz gut. Ich würde den Code nun jedoch lieber etwas übersichtlicher gestalten soweit möglich.
Dazu fällt mir zunächst auf, dass der nachfolgende Teil der Abfrage tlw. redundant erscheint:
... AND (Name <> 'Tim') AND (Name <> 'Uta')";
Meine Versuche dies zu kürzen sind jedoch fehlgeschlagen:
1. AND (Name <> ('Tim' OR 'Uta'));
2. AND (Name <> OR('Tim', 'Uta'));
Und nun frage ich mich und hiermit euch, ob man auf das wiederholte auflisten von "Name <>" verzichten kann und trotzdem "Tim" und "Uta" von der Abfrage ausschließen kann.(?)
Daraus ergibt sich dann die nächste Frage. Derzeit will ich nur Tim und Uta ausschließen. Weitere Ausnahmen sind jedoch nicht auszuschließen und deshalb wäre der Abgleich mit einem Array/Liste o. ä. noch komfortabler, falls möglich.
$ausnahmen = array("Tim","Uta");
AND (Name <> $array)
Auch hier bin ich für Lösungsansätze dankbar.
Hi!
Suchst Du so etwas:
SELECT * FROM Tabelle
WHERE name NOT IN ('name1', 'name2', ...);
~~~?
Mehr dazu steht im [Handbuch](http://dev.mysql.com/doc/refman/5.1/de/any-in-some-subqueries.html).
off:PP
--
"You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
Hi!
Suchst Du so etwas:
SELECT * FROM Tabelle
WHERE name NOT IN ('name1', 'name2', ...);
Ergänzend: Speziell in SQL gibt es (bzw. fällt mir grad ein) als Zusammenfassung nur IN(), BETWEEN und die Mustersuche (LIKE/REGEXP). Ansonsten und auch anderenorts allgemein üblich muss man jedoch in den sauren Apfel beißen und jede Bedingung einzeln formulieren. Aus der menschlichen Sprache bekannte Formulierungen à la "wenn der Name Tom oder Uta ist" würde man vielleicht umsetzen zu "Name = Tom or Uta". Das ist schwer zu unterscheiden von "Name = Tom or anderer boolescher Ausdruck". Einmal soll sich der Wert nach dem or (Uta) auf den Namen beziehen, im anderen Fall eigenständig ausgewertet werden. Da helfen auch keine Klammern. Man könnte dann höchstens statt der ()-Klammern irgendwelche anderen nehmen, um den Bedeutungsunterschied klarzustellen. Aber {} und [] und selbst <> sind schon vergeben.
> Mehr dazu steht im [Handbuch](http://dev.mysql.com/doc/refman/5.1/de/any-in-some-subqueries.html).
Du hast das Subquery-IN verlinkt aber das [Einzelwerte-IN](http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in) verwendet.
Lo!
Hi!
Du hast das Subquery-IN verlinkt aber das Einzelwerte-IN verwendet.
Stimmt, danke für die Korrektur!
off:PP
Hallo Peter Pan und dedlfix,
vielen lieben Dank für eure hilfreichen Antworten. Es funktioniert wie gewünscht und mit implode()
sollte ich auch die Abfrage mit Name aus einem Array hinkriegen.
Freundliche Grüße
Kackfohgel