Baccu: SQL Auswahlfelder variiren

Hi,
Ich möchte dem User ein Formular zur Verfügung stellen womit er, anhand von Auswahlfeldern Ergebnisse sortieren kann.
d.h. es stehen folgende Selectfelder zu Verfügung:
Geschlecht(Frau, Mann, Gruppe)
Augenfarbe(blau, grün, braun)
Haarfarbe(blond, braun, schwarz)
Jedes Profil in der DB hat entsprechende Einträge, wenn ich nun folgenden SQL-Befehl anwende:
SELECT Geschlecht, Haarfarbe, Augenfarbe FROM UserProfil WHERE Geschlecht = '"+Geschlecht+"' AND Haarfarbe= '"+Haarfarbe+"' AND Augenfarbe = '"+Augenfarbe +"';
Bekomme ich nur das gewünschte Ergebnis wenn ich in allen 3 Auswahlfeldern eine Auswahl treffe.
Wenn ich z.B. nur nach Frauen suche bekomme ich keinen Eintrag angezeigt.
Ist ja auch klar, da nicht ausgewählte Einträge 'undefined' bzw. leer sind und in der DB kein 'undefined' oder leerer Eintrag gefunden werden kann.

Meine Frage an euch lautet also:
Wie kann ich den SQL-Befehl so variieren das der User entweder 1, 2 oder 3 Auswahlfelder ändern kann und dann z.B. nur Gruppen oder nur Frauen mit blauen Augen oder nur Männer mit braunen Augen und schwarzen Haaren angezeigt bekommt.

Kann mir jemand helfen, kennt jemand ein Beispiel?
Danke schon mal

  1. Tag Baccu.

    es stehen folgende Selectfelder zu Verfügung:
    Geschlecht(Frau, Mann, Gruppe)
    Augenfarbe(blau, grün, braun)
    Haarfarbe(blond, braun, schwarz)
    SELECT Geschlecht, Haarfarbe, Augenfarbe FROM UserProfil WHERE Geschlecht = '"+Geschlecht+"' AND Haarfarbe= '"+Haarfarbe+"' AND Augenfarbe = '"+Augenfarbe +"';

    Du verwendest AND, was bedeutet, dass alle drei Bedingungen erfüllt sein müssen, damit das Statement ein Ergebnis liefert. Wählst du nur einen Eintrag aus, würde die Anfrage so aussehen:

    SELECT spalten FROM tabelle WHERE Geschlecht='Frau' AND Haarfarbe='' AND Augenfarbe=''

    Das findet alle Einträge, wo das Geschlecht 'Frau' ist und die Spalten Haarfarbe und Augenfarbe leer sind. Wenn du allerdings sowas machst:

    SELECT spalten FROM tabelle WHERE Geschlecht='Frau' OR Haarfarbe='' OR Augenfarbe=''

    bekommst du die Datensätze zurück, welche eine der drei Bedingungen erfüllen. Vorausgesetzt, dass die Spalten Haarfarbe und Augenfarbe nie leer sind, würde dir die o.g. Abfrage alle Frauen liefern. Nebenbei kannst du so auch alle Frauen mit blauen Augen finden. Weitere Infos: mySQL: logische Operatoren.

    Siechfred

    --
    Zum Testen freigegeben: Siechfreds kleines Weblog
    Wer Fehler findet, bitte an die angegebene E-Mail schicken. Danke.
    1. Hallo,

      SELECT spalten FROM tabelle WHERE Geschlecht='Frau' OR Haarfarbe='' OR Augenfarbe=''
      bekommst du die Datensätze zurück, welche eine der drei Bedingungen erfüllen.
      Nebenbei kannst du so auch alle Frauen mit blauen Augen finden.

      Ja? Wie?

      SELECT spalten FROM tabelle WHERE Geschlecht='Frau' OR Haarfarbe='' OR Augenfarbe='blau'
      liefert alle Datensätze, wenn im Feld Geschlecht "Frau" steht oder wenn im Feld Augenfarbe "blau" steht, also auch blauäugige Männer ;-)).

      viele Grüße

      Axel

      1. Tag Axel.

        Nebenbei kannst du so auch alle Frauen mit blauen Augen finden.
        Ja? Wie?

        Du hast Recht. Jaja, die Logik ... ;-)

        Siechfred

        --
        Zum Testen freigegeben: Siechfreds kleines Weblog
        Wer Fehler findet, bitte an die angegebene E-Mail schicken. Danke.
  2. Hallo,

    d.h. es stehen folgende Selectfelder zu Verfügung:
    Geschlecht(Frau, Mann, Gruppe)
    Augenfarbe(blau, grün, braun)
    Haarfarbe(blond, braun, schwarz)
    Meine Frage an euch lautet also:
    Wie kann ich den SQL-Befehl so variieren das der User entweder 1, 2 oder 3 Auswahlfelder ändern kann und dann z.B. nur Gruppen oder nur Frauen mit blauen Augen oder nur Männer mit braunen Augen und schwarzen Haaren angezeigt bekommt.

    Dafür musst Du mit der serverseitigen Programmiersprache herausfinden, welche Optionen gewählt sind _bevor_ Du den SQLString zusammenbaust, mit dem Du die Datenank abfragst.

    Pseudocode mit MySQL-Query:
    SQLString = "SELECT Geschlecht, Haarfarbe, Augenfarbe FROM UserProfil WHERE 1 "
    Wenn Geschlecht ausgewählt, dann
      SQLString = SQLString + "AND Geschlecht = '" + Geschlecht + '"
    Wenn Haarfarbe ausgewählt, dann
      SQLString = SQLString + "AND Haarfarbe = '" + Haarfarbe + '"
    Wenn Augenfarbe ausgewählt, dann
      SQLString = SQLString + "AND Augenfarbe = '" + Augenfarbe + '"

    viele Grüße

    Axel

  3. » Meine Frage an euch lautet also:

    Wie kann ich den SQL-Befehl so variieren das der User entweder 1, 2 oder 3 Auswahlfelder ändern kann und dann z.B. nur Gruppen oder nur Frauen mit blauen Augen oder nur Männer mit braunen Augen und schwarzen Haaren angezeigt bekommt.

    In Mysql und mit PHP geht das beispielsweise so:

    $sql = "SELECT * FROM tabelle WHERE
      IF('$geschlecht'='', 1, '$geschlecht'=Geschlecht) AND
      IF('$augenfarbe'='', 1, '$augenfarbe'=Augenfarbe) AND
      IF('$haarfarbe'='', 1, '$haarfarbe'=Haarfarbe)";

    Wenn $geschlecht leer ist, ist der Teilausdruck erfüllt, sonst wird dessen Inhalt mit dem gleichnamigen Tabellenfeld verglichen. [1]

    oder so:

    $where = array();
    if (strlen($geschlecht)) $where[] = "'$geschlecht'=Geschlecht";
    if (strlen($augenfarbe)) $where[] = "'$augenfarbe'=Augenfarbe";
    if (strlen($haarfarbe)) $where[] = "'$haarfarbe'=Haarfarbe";

    $sql = 'SELECT * FROM tabelle';
    if (count($where))
      $sql .= ' WHERE ' . implode(' AND ', $where);

    In anderen SQL-Dialekten bzw. Programmiersprachen gibt es sicher ähnliche Konstrukte.

    [1] P.s. für Insider: Hier ist die berühmte IF-Funktion im Einsatz zu sehen, die es ja eigentlich gar nicht gibt :-)

    1. Hallo und Danke,
      das war genau der Tip der mir fehlte klappt wunderbar.
      Baccu

    2. Hallo,

      In Mysql und mit PHP geht das beispielsweise so:
      $sql = "SELECT * FROM tabelle WHERE
        IF('$geschlecht'='', 1, '$geschlecht'=Geschlecht) AND
        IF('$augenfarbe'='', 1, '$augenfarbe'=Augenfarbe) AND
        IF('$haarfarbe'='', 1, '$haarfarbe'=Haarfarbe)";

      Warum sollte man diese Entscheidungen der Datenbank überlassen, wenn man mit der Programiersprache weitaus kürzere und damit schnellere Queries erstellen könnte? Man muss mit der Programmiersprache ohnehin arbeiten, um die Rückgabewerte des Formulars erst mal zu entschärfen und zu prüfen. Dann kann man auch gleich den richtigen Query zusammen bauen.

      [1] P.s. für Insider: Hier ist die berühmte IF-Funktion im Einsatz zu sehen, die es ja eigentlich gar nicht gibt :-)

      Warum sollte es die in bestimmten SQL-Dialekten nicht geben? Man muss nur wissen, welchen Dialekt die Datenbank spricht.

      viele Grüße

      Axel

      1. » Warum sollte man diese Entscheidungen der Datenbank überlassen, wenn man mit der Programiersprache weitaus kürzere und damit schnellere Queries erstellen könnte?

        "Schnell" kommt immer drauf an... Wenn die Programmumgebung langsam ist (interpretiert) und die DB schnell (Maschinencode) ist es schon eine Überlegung wert, wer welche Aufgabe bekommt.

        Um beispielsweise die Funktionalität von Prepared Statements nutzen zu können kann man nicht immer wieder neu zusammengebaute SQL-Anfragen verwenden. Dann würde ich mein Konstrukt vorziehen, dann natürlich mit Platzhaltern.

        [1] P.s. für Insider: Hier ist die berühmte IF-Funktion im Einsatz zu sehen, die es ja eigentlich gar nicht gibt :-)
        Warum sollte es die in bestimmten SQL-Dialekten nicht geben? Man muss nur wissen, welchen Dialekt die Datenbank spricht.

        Dieser Seitenhieb war nicht direkt auf SQL bezogen, sondern auf die allgemein gern von Neulingen nicht korrekt bezeichnete Formulierung if-Funktion/-Schleife und die Antworten darauf. :-)