MySQL Abfrage

Wurzelsepp_71

Grünschnabel
Hallo liebes Forum!
Ich bin neu hier. Ein Forum ist normalerweise mein aller letzter Ausweg um mich aus einer Sackgasse herauszuholen. Googeln und viel ausprobieren hat bisher keinen Erfolg gebracht. Weil hier aber, wie ich beim durchstöbern der relevanten Themen gesehen habe, ein netter und hilfreicher Umgangston herrscht, wende ich mich jetzt an Euch.

So schauts gerade aus:
Ich habe zwei Tabellen: "Normen" und "Werkstoffe".
Die Tabelle "Normen" hat die Spalte "ID" als Primärschlüssel welche sich in der Tabelle "Werkstoffe" als Fremdschlüssel wiederfindet. "Normen" hat dann noch die Spalten "Bezeichnung" und "Langtext". Die Tabelle "Werkstoffe" hat auch noch einige Spalten, die für die Suche relevanten sind "wnr" und "kurzname".

Die Aufgabe:
Ich soll die Tabelle Werkstoffe anhand eines Suchbegriffes durchsuchen und alle Treffer anzeigen.
Bisher hatte ich die Spalte "Norm" in der Tabelle "Werkstoffe" drinnen. Da wars kein Problem die Tabelle zu durchsuchen. Jetzt bin ich´s aber angegangen die Tabellen zu trennen. Durchsucht werden soll aus der TAB "Werkstoffe" die Spalten "wnr" und "Kurzname" und aus der TAB "Normen" die Spalte "Bezeichnung".

Das Problem:
Jetzt, wo ich in der zu durchsuchenden Tabelle keine Spalte "Norm" mehr habe sondern nur noch die Spalte norm_id mit dem jeweiligen Fremdschlüssel, hab ich das Problem, die beiden Tabellen irgendwie für die Suche verknüpfen zu müssen.

Das hatte ich bisher als query, als es nur eine Tabelle gab:
PHP:
 $sql = "SELECT * FROM Werkstoffe WHERE ((kurzname LIKE '%".$_GET['suche']."%') OR (wnr LIKE '%".$_GET['suche']."%') OR (Norm LIKE '%".$_GET['suche']."%'))";

Das ist jetzt der klägliche Versuch, die beiden Tabellen zu verknüpfen:
PHP:
 $sql = "SELECT T1.wnr, T1.kurzname, T2.bezeichnung FROM Werkstoffe T1,Normen T2 WHERE ((kurzname LIKE '%".$_GET['suche']."%') OR (wnr LIKE '%".$_GET['suche']."%') OR (Bezeichnung LIKE '%".$_GET['suche']."%')) ";

Ja ja, Informatiker sehen auf den ersten Blick, dass das so nix werden kann... Ich hab aber noch einen Knopf im Hirn... Ich dachte, die Abfragen halbwegs behirnt zu haben, scheint aber nicht so zu sein :)
 
Hi und Willkommen bei Tutorials.de :)

Deine zweite Abfrage schaut schon nicht schlecht aus... Wichtig zu verstehen ist aber, dass bei Abfragen mit zwei Tabellen "jede" Zeile von Tabelle1 mit "jeder" von Tabelle2 kombiniert wird und das dann das Ergebnis ist (bzw., zuerst wird noch das Where durchgefiltert usw.). Für jeden Werkstoff hat man so alle Normen, nicht nur die eine die dazugehört.

Einfache Lösung: Eine weitere Where-Bedingung
Code:
...WHERE T1.norm=T2.id AND ...
nach dem AND die restlichen Bedingungen, die schon vorhanden sind. (Nehme an, die Werkstoff-Spalte mit der Norm-ID heißt norm). Das wäre soweit alles, dass man nur Ergebniszeilen bekommt wo Werkstoff und Norm zusammenpassen.

Es gibt das Selbe in einer anderen Schreibweise (Join), aber macht keinen Unterschied. (Außer dass Joins auch für andere Sachen verwendet werden können, aber wie gesagt hier egal).

...

Ein anderes, wichtiges Problem: Nie GET-Variablen usw. direkt in die Abfrage einfügen. Das ermöglicht jedem, die gesamte Abfrage (also den SQL-Teil nicht nur den Suchwert) beliebig zu manipulieren. Siehe Prepared Statements als Lösung.

Und ein kleinerer Verbesserungsvorschlag noch: Das T1. und T2. überall, auch bei den Spaltennamen im Where, verwenden. Sollte ein Spaltenname in beiden Tabellen vorkommen gibts so keine Unklarheiten.
 
@sheel war schneller, ich war noch am schreiben. Ich hätte es so gelöst, wenn ich Dich richtig verstanden habe.
PHP:
$suche = "bez.1";
$sql = "
SELECT
    n.bezeichnung, n.langtext,
    w.wnr, w.kurzname
FROM
    normen n
LEFT JOIN
    werkstoffe w
ON
    n.id = w.id_norm
WHERE
    (
        (w.kurzname LIKE '%".$suche."%')
    OR
        (w.wnr LIKE '%".$suche."%')
    OR
        (n.bezeichnung LIKE '%".$suche."%')
    )
";
$db->query($sql);

Was Du natürlich für Dich anpassen musst.
 
Hallo sheel, hallo DerKleene1,
das ist eine ganz tolle Sache :) Na ja, nicht zu viel Neuamerikanisch...
Nein, wirklich, ich habs hinbekommen mit Eurer Hilfe! Zugegeben, die einfache Variante mit der zusätzlichen Bedingung hat mich ans Ziel gebracht. Die Variante mit dem LEFT JOIN muss ich mir noch genauer anschauen. Da weiß ich noch nicht so genau, was da im Detail passiert.
Aber jedenfalls ein großes Danke, wirklich eine Freude, einmal nicht mit einem link zu einem tutorial abgespeist zu werden :)
 
Zurück