Rüdiger: verzwicktes SQL-Statement

Hallo zusammen,

habe folgendes Problem. ich habe in einer Suchmaske drei vordefinierte Dropdown-Menüs die aus einer Datenbank gefüllt werden.
Als erste Wert in jedem Menü ist "alle" ausgewählt. Wenn jetzt in jedem Dropdown-Menü ein anderer Wert als "alle" ausgewählt wird ist die sql abfrage kein Problem:

SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=$farbe AND gruppe=$gruppe AND komponente=$komponente ORDER BY farbe ASC

Jetzt kommt das aber. Wenn in einem Dropdown-Menü kein anderer Wert ausgewählt wurde als "alle", muss ich dann mit if und else alle Möglichkeiten mit einem eigenen SQL-Statement abdecken oder kann ich das in einem machen? Da hörts bei mir aber leider auf, hab auch beim googlen  nichts gefunden.
diese Möglichkeit funktioniert natürlich nicht aber nur so als Erklärung:

SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=* AND gruppe=* AND komponente=* ORDER BY farbe ASC

Hat da einer eine zündende Idee?
Vielen Dank im voraus für eure Hilfe.

Gruß Rüdiger

  1. Hallo,

    SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=* AND gruppe=* AND komponente=* ORDER BY farbe ASC

    WHERE farbe = farbe ...

    Grüße
    Marcus

    --
    si vis pacem, para iustitiam
    1. Hallo,

      Hallo,

      SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=* AND gruppe=* AND komponente=* ORDER BY farbe ASC

      WHERE farbe = farbe ...

      Du kannst natürlich auch die Bedingung einfach weglassen

        
      SELECT farbe, gruppe, komponente  
      FROM   Tabellen_name  
      WHERE  gruppe = $gruppe  
      AND    komponente = $komponente  
      
      

      Grüße
      Marcus

      --
      si vis pacem, para iustitiam
      1. Hallo zusammen

        erstmal vielen dank für eure antworten.
        nach etwas schlaf und sinieren hab ich das so gelöst:

        if($_POST['select_farbe'] == "alle") {
        $such_farbe = "";
        }else{
        $such_farbe = $_POST['select_farbe'];}

        if($_POST['select_grup'] == "alle") {
        $such_grup = "";
        }else{
        $such_grup = $_POST['select_grup'];}

        if($_POST['select_kompo'] == "alle") {
        $such_kompo = "";
        }else{
        $such_kompo = $_POST['select_kompo'];}

        $sql = "SELECT verfahren, gruppe, komponente, thema, thema_text FROM inhalte WHERE verfahren LIKE '%$such_farbe%' AND gruppe LIKE '%$such_grup%' AND komponente LIKE '%$such_kompo%' AND thema LIKE '%$suchen_worte%'";

        weiß jetzt nicht ob das eine saubere lösung ist aber es funzt :-)
        nochmal danke

        Gruß Rüdiger

  2. echo $begrüßung;

    Wenn in einem Dropdown-Menü kein anderer Wert ausgewählt wurde als "alle", muss ich dann mit if und else alle Möglichkeiten mit einem eigenen SQL-Statement abdecken oder kann ich das in einem machen?
    SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=* AND gruppe=* AND komponente=* ORDER BY farbe ASC

    Im Prinzip macht man das mit einzelnen IFs. Ich gehe mal davon aus, dass du PHP nimmst und da würde ich das so machen:

    Zuerst brauchen wir ein definiert leeres Array:

    $bedingungen = array();

    Eine Bedingung sieht so aus, die anderen ähnlich:

    if ($farbe != 'alle')
        $bedingungen[] = sprintf("farbe='%s'", mysql_real_escape_string($farbe));

    Nun enthält $bedingungen 0 bis n Werte der Form: farbe='irgendwas'. Dies kann mit implode und ' AND ' als "Klebstoff" zusammengefügt werden

    $bedingung = implode(' AND ', $bedingungen);

    und kann dann an das WHERE gehängt werden.

    Anderenfalls könnte man noch WHERE farbe=farbe... nehmen (diese Bedingung ist ja immer erfüllt), aber auch hier braucht es ein paar if, die die '' mal (bei alle) weglasen oder sie bei anderen Werten (inklusive Escaping) hinzufügt.

    echo "$verabschiedung $name";

  3. Als erste Wert in jedem Menü ist "alle" ausgewählt. Wenn jetzt in jedem Dropdown-Menü ein anderer Wert als "alle" ausgewählt wird ist die sql abfrage kein Problem:

    SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE farbe=$farbe AND gruppe=$gruppe AND komponente=$komponente ORDER BY farbe ASC

    Jetzt kommt das aber. Wenn in einem Dropdown-Menü kein anderer Wert ausgewählt wurde als "alle", muss ich dann mit if und else alle Möglichkeiten mit einem eigenen SQL-Statement abdecken oder kann ich das in einem machen?

    Was ist daran verzwickt?
    einfach die Bedingung weglassen.

    Ich kann nur Perl, da würd ich es ungefähr so machen:

      
    my @bedingungen = ();  
    push @bedingungen, 'farbe=' . $DBH->quote( $farbe) if $farbe;  
    push @bedingungen, 'gruppe=' . $DBH->quote( $gruppe) if $gruppe;  
    push @bedingungen, 'komponente=' . $DBH->quote( $komponente  ) if $komponente ;  
      
    my where = join ' AND ', @bedingungen;  
    my $sth = $DBH->prepare( "SELECT farbe, gruppe, komponente FROM Tabellen_name WHERE $where ORDER BY farbe ASC");  
    
    

    @bedingungen ist ein Array und  join heißt in PHP glaub ich implode.

    Struppi.

    --
    Javascript ist toll (Perl auch!)