[MySQL] Mehrere Kriterien kombinieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [MySQL] Mehrere Kriterien kombinieren

    Hallo zusammen
    Ich habe ein Problem mit einer Datenbankabfrage, und ich komme absolut nicht darauf wie man es lösen kann. Ich möchte gerne die Beständigkeit mehrerer Werkstoffe gegen ein Medium (Säuren usw.) herausfinden.

    Dazu habe ich folgende Tabellen habe ich in meiner Datenbank:

    Medium

    Quellcode

    1. medID Medium Graphit Steel PTFE
    2. 1 Aceton 1 1 1
    3. 2 Acetamid 1 0 1
    4. 3 Benzolchlorid 0 1 1


    Produkte

    Quellcode

    1. prodID Bez aktiv Graphit Steel PTFE TALuft BAM
    2. 1 Bla1 1 1 1 0 1 1
    3. 2 Bla2 1 0 1 1 1 1
    4. 2 Bla3 1 0 0 1 1 1


    Ich gebe die Tabelle Medium in einem Selectfeld aus, mit dem sich der Anwender halt ein Medium auswählen kann. Über die medID die die Auswahl ergibt, hole ich mir die dazugehörigen Daten aus der Tabelle und.
    Anschließend bastle mit dieser Abfrage einen Query zusammen:

    Quellcode

    1. if($_REQUEST['medium'] !=="" && $med_Graphit == 1){$medium1 = " AND graphit = $med_Graphit";}
    2. else{$medium1 = " ";}
    3. if ($_REQUEST['medium'] !=="" && $med_Steel == 1){$medium2 = " AND steel = $med_Steel";}
    4. else{$medium2 .= "";}
    5. if ($_REQUEST['medium'] !=="" && $med_Ptfe == 1){$medium3 = " AND ptfe = $med_Ptfe";}
    6. else{$medium3 = "";}


    Diesen füge ich dann in die Datenbankabfrage

    Quellcode

    1. $pre = "SELECT * FROM produkte WHERE aktiv = 1 ";
    2. $sql = $db->Query($pre . $f_taluft . $f_dvgw . $f_firesafe . $f_fda . $f_bam . $f_uvv . $medium1 . $medium2 . $medium3 . $flangetype . $flangeart . $temperature . $pressure);


    ein. Die anderen Kriterien werden über anwählbare Checkboxen eingefügt, wenn markiert.
    Diese Abfrage funktioniert, wenn ich kein Medium aus der Selectbox auswähle. Sobald ich eins Auswähle, gibt er mir keine Daten aus. Ich programmiere leider nicht so oft und bin hier mit meinem Wissen echt an die Grenze gestossen. Vielleicht kann mir ja jemand von euch einen Tip geben wie man solch eine Abfrage lösen kann.

    Wäre euch sehr dankbar.

    LG

    Micha
  • Hallöchen

    Also der Code den ich hier jetzt Poste ist wahrscheinlich für jemanden der Ahnung hat lachhaft. Aber ich bin ja Anfänger, deshalb hoffe ich ihr lacht mich jetzt nicht aus:)

    Quellcode

    1. // Suchabfrage-Kriterien
    2. // TA-Luft
    3. if($_REQUEST['taluft'] == 1){ $f_taluft = " AND taluft = $_REQUEST[taluft]";}
    4. //DVGW
    5. if($_REQUEST['dvgw'] == 1){ $f_dvgw = " AND dvgw = $_REQUEST[dvgw]";}
    6. //DVGW
    7. if($_REQUEST['firesafe'] == 1){ $f_firesafe = " AND firesafe = $_REQUEST[firesafe]";}
    8. //FDA
    9. if($_REQUEST['fda'] == 1){ $f_fda = " AND fda = $_REQUEST[fda]";}
    10. //BAM
    11. if($_REQUEST['bam'] == 1){ $f_bam = " AND bam = $_REQUEST[bam]";}
    12. //UVV
    13. if($_REQUEST['uvv'] == 1){ $f_uvv = " AND uvv = $_REQUEST[uvv]";}
    14. //Flanschtyp
    15. if($_REQUEST['flanschtyp'] == "All"){$flangetype .= "";}
    16. if($_REQUEST['flanschtyp'] == "Stahl"){$flangetype .= " AND stahl = 1";}
    17. if($_REQUEST['flanschtyp'] == "Email"){$flangetype .= " AND email = 1";}
    18. if($_REQUEST['flanschtyp'] == "Gfk"){$flangetype .= " AND gfk = 1";}
    19. if($_REQUEST['flanschtyp'] == "Kunststoff"){$flangetype .= " AND kunststoff = 1";}
    20. //Flanschtyp
    21. if($_REQUEST['flanschart'] == "All"){$flangeart .= "";}
    22. if($_REQUEST['flanschart'] == "Ibc"){$flangeart .= " AND ibc = 1";}
    23. if($_REQUEST['flanschart'] == "Tg"){$flangeart .= " AND tg = 1";}
    24. if($_REQUEST['flanschart'] == "Sr"){$flangeart .= " AND sr = 1";}
    25. // Temperatur
    26. if($_REQUEST['temperatur'] !== ""){ $temperature = " AND tmax >= $_REQUEST[temperatur]";}
    27. // Druck
    28. if($_REQUEST['druck'] !== ""){ $pressure = " AND druck >= $_REQUEST[druck]";}
    29. //Abfrage für Medium
    30. if($_REQUEST['medium'] !=="" && $med_Graphit == 1){$medium1 = " AND graphit = $med_Graphit";}
    31. else{$medium1 = " ";}
    32. if ($_REQUEST['medium'] !=="" && $med_Steel == 1){$medium2 = " AND steel = $med_Steel";}
    33. else{$medium2 .= "";}
    34. if ($_REQUEST['medium'] !=="" && $med_Ptfe == 1){$medium3 = " AND ptfe = $med_Ptfe";}
    35. else{$medium3 = "";}
    36. //Produkte aus Datenbank abfragen
    37. $pre = "SELECT * FROM produkte WHERE aktiv = 1 ";
    38. $sql = $db->Query($pre . $f_taluft . $f_dvgw . $f_firesafe . $f_fda . $f_bam . $f_uvv . $medium1 . $medium2 . $medium3 . $flangetype . $flangeart . $temperature . $pressure);
    39. $total = $sql->NumRows();
    40. if($total>0){
    41. $output = "";
    42. while($pdata= $sql->fetchrow())
    43. {
    44. $output .= '<p><b>'.$pdata->artBez.'</b><br />'.$pdata->artBesch.'<br />';
    45. }
    46. }
    47. else {
    48. $output .= '<b>Es konnten Leider keine Materialien gefunden werden, die Ihre Kriterien erf&uuml;llen</b>';
    49. }
    Alles anzeigen


    Das ganze ist bisher noch nicht ausgeschmückt mit sicherheitsabfragen o.ä. Wollte erstmal die Abfrage richtig hinbekommen.

    Gruß

    Micha
  • wenn du im PHP Forum gepostet hättest, würde ich dir sagen, dass du die ganzen if/else durch eine switch/case ersetzen sollst.
    Aber hier interessiert mich nur der tatsächliche SELECT.
    Wenn du keine Ergebnisse bekommst, obwohl du Ergebnisse bekommen solltest, ist vielleicht ein Syntaxfehler drin.
    Wie reagiert deine DB Klasse auf Syntaxfehler?
    Lass dir einfach mal in #51 den Query-String ausgeben (siehe mein erstes Posting)
  • Wenn ein Medium gewählt wird, gegen das alle drei Materialien beständig sind, gibt er mir diesen select aus:

    Quellcode

    1. SELECT * FROM produkte WHERE aktiv = 1 AND graphit = 1 AND steel = 1 AND ptfe = 1


    Das soll er ja auch, dass Problem ist jetzt nur das er mir keine daten aus der Datanbank ausgibt.
    Theoretisch müsste er mir doch jetzt alle Produkte, die entweder aus graphit, steel, ptfe, graphit und steel, steel und ptfe usw. ausgeben, oder nicht?

    Wenn ich jetzt aber das Medium weglasse, und nur nach Freigaben Abfrage:

    Quellcode

    1. SELECT * FROM produkte WHERE aktiv = 1 AND taluft = 1 AND dvgw = 1 AND firesafe = 1


    Gibt er mir die richtigen Produkte raus.

    Zerbrech mir darüber schon seit drei tagen den Kopf :cursing:
  • Ich muss das Thema doch nochmal aufgreifen, dachte ich hätte es gelöst.
    Es gibt immer noch ein Problem:

    Ich habe eine Abfrage die sieht wie folgt aus

    Quellcode

    1. SELECT * FROM `produkte` WHERE `aktiv` = 1 AND `taluft` = 1 AND `group` = 11 OR `group` = 33 OR `group` = 12 OR `group` = 25 OR `group` = 26 OR `group` = 27


    Er gibt mir jetzt alle Produkte aus deren group o.g. entspricht.
    Das Problem ist, dass er mir auch dann noch alle Produkte mit den groups ausgibt, wenn andere Kriterien z.B. taluft gar nicht erfüllt werden.
    Muss man eine bestimmte Reihenfolge einhalten bei Select oder wie kann man das ganze so eingeben das alle Kriterien berücksichtig werden?

    Gruß

    Micha