MySQL -> Abfrage mit Bedingung in zwei Tabellen
Dieter
- datenbank
Hallo,
ich habe leider ein Abfrage-Problem wo ich trotz Lektüre nicht zu einem Ergebnis komme.
Ich habe u.a. 2 Tabellen mit folgendem Aufbau:
Tabelle 01 (Adressen)
Spalte "id"
Spalte "Vorname"
Spalte "Nachname"
Spalte "Ort"
Tabelle 02 (Bereiche)
Spalte "id"
Spalte "grundid" (beinhaltet die jeweilige ID aus der Tabelle 01)
Spalte "bereich"
Spalte "zusatzwert"
Die Daten sind derart gespeichert, das zu einer Adresse mehrere Bereiche existieren können.
Wie kann ich jetzt eine Select - Abfrage ausführen, die z.B.:
a) alle passenden Datensätze aus Tabelle 01 liefert wenn in Tabelle 02 ein Datensatz mit der korrekten Bereichszahl (also alle Daten aus 01 wenn in 02 deren ID als "grundid" zusammen mit dem gesuchtem Bereichswert) steht ?
b) alle passenden Datensätze aus Tabelle 01 liefert wenn in der Tabelle 02 nicht nur ein Wert (wie in meiner a.-Frage), sondern z.b. zwei Werte stimmen müssen ?
Bis jetzt werte ich die Rückgaben immer per "mysql_fetch_object" aus.
Aber ich komme einfach mit JOIN nicht zurecht und leider unterstützt die mysql-Version des Hosters keine Sub-Selects.
Ich hoffe mir kann jemand helfen, ein Beispielcode wäre super...
Gruss
Dieter
Mahlzeit Dieter,
a) alle passenden Datensätze aus Tabelle 01 liefert wenn in Tabelle 02 ein Datensatz mit der korrekten Bereichszahl (also alle Daten aus 01 wenn in 02 deren ID als "grundid" zusammen mit dem gesuchtem Bereichswert) steht ?
Indem Du Dir die passenden Datensätze aus der Tabelle "Bereiche" ausgeben lässt und die Ergebnismenge mit der Tabelle "Adressen" über die Felder "grundid" (aus "Bereiche") und "id" (aus "Adressen") verknüpfst.
b) alle passenden Datensätze aus Tabelle 01 liefert wenn in der Tabelle 02 nicht nur ein Wert (wie in meiner a.-Frage), sondern z.b. zwei Werte stimmen müssen ?
Indem Du als Kriterium für die Verknüpfung nicht nur die Gleichheit jeweils einer Spalte pro Tabelle angibst, sondern einfach jeweils zwei Spalten auf Gleichheit prüfst.
Bis jetzt werte ich die Rückgaben immer per "mysql_fetch_object" aus.
D.h. Du nutzt PHP? Ist zwar interessant, aber zur Zeit irrelevant.
Aber ich komme einfach mit JOIN nicht zurecht
Was genau ist Dein Problem? Eventuell ist für Dich die Lektüre der "Einführung in Joins" empfehlenswert.
und leider unterstützt die mysql-Version des Hosters keine Sub-Selects.
Frage Deinen Hoster, warum er eine schon lange veraltete, nahezu vorsintflutliche Version einsetzt. Frage ihn, ob ihm bewusst ist, dass normalerweise nur die aktuelle(n) Versionen insbesondere in bezug auf Sicherheitsfragen supportet werden.
MfG,
EKKi
Hallo Ekki,
soooo, dank deiner Hilfe (und dem sehr gutem Tut das du genannt hattest) konnte ich das größte Problem lösen und habe nun zumindest eine
JOIN-Abfrage die tatsächlich auch die gewünschten Ergebnisse liefert, ABER...
Jetzt stehe ich vor dem nächstem Problem, das mir meine Abfrage auch "doppelte" Ergebnisse bringt, d.h. mehrere gleiche Adressen weil meine Bedingung mehrmals zutrafen. Wie kann ich das hinbekommen, das er mir nur einmal einen Satz aus der Tabelle 01 zurückgibt, auch wenn die Bedingungen in Tabelle 02 häufiger zutreffen ?
Meine query ist derzeit:
SELECT * FROM tabelle01 JOIN tabelle02 ON tabelle01.id = tabelle02.grundid AND tabelle02.zusatzwert = '$variable'
Gruss
Dieter
PS: Ich hoffe ich habe diesmal mein Problem besser umschrieben...sorry für den anderen Post..
Mahlzeit Dieter,
Jetzt stehe ich vor dem nächstem Problem, das mir meine Abfrage auch "doppelte" Ergebnisse bringt, d.h. mehrere gleiche Adressen weil meine Bedingung mehrmals zutrafen.
Wieso ist das ein Problem? Wenn mehrere Datensätze in Tabelle 02 auf die gleiche Adresse verweisen, ist das halt so. Willst Du jede Adresse nur einmal sehen? Wie entscheidest Du dann, welchen der Einträge aus Tabelle 02, die dazu passen, Du sehen willst?
Wie kann ich das hinbekommen, das er mir nur einmal einen Satz aus der Tabelle 01 zurückgibt, auch wenn die Bedingungen in Tabelle 02 häufiger zutreffen ?
Hm, was genau möchtest Du?
Dir ist schon klar, dass Du dann Informationen verlierst, wenn Du nur "irgendeinen" Datensatz aus Tabelle 02 anzeigen lässt (zudem besteht dann die Frage, nach welchem Kriterium Du bestimmten willst, welchen der Datensätze aus Tabelle 02, die auf den gleichen Datensatz in Tabelle 01 verweisen, Du haben willst)?
MfG,
EKKi
Hallo Ekki,
das Problem ist eigentlich a.m.S. relativ komplex zu umschreiben, aber ich versuche es einmal:
Ich habe u.a. eine Tabelle mit Adressinformationen, zudem eine Tabelle mit Eigenschaften die ich jeder Adresse zuordne, hierbei entspricht eine Eigenschaft jeweils ein Datensatz. Mein Problem ist nun, das ich für eine Suchfunktionen die Adressen nach Eigenschaften filtern lassen möchte, was ja, auch mittlerweile dank dir funktioniert.
Da aber ein Adressedatensatz auch mehrere Eigenschaften (also einzelne Datensätze in der Eigenschaften-DB) hat, funktioniert der SELECT via JOIN (leider) so, das er den Adressdatensatz so häufig selectiert, wie es hierzu Eigenschafteneinträge gibt. Das bedeutet, wenn z.B. ein Adressdatensatz 4 Eigenschaftensätze hat, das mir die query 4 x diese Adresse ausgibt -> was mir ja auch logisch erscheint, da die query ja ganz genau diese Anweisung hat.
Da ich aber die Ergebnisse der Query auf mehrere (Anzeige-)Seiten verteilen will, also nur x Ergebnisse pro Seite, kann ich ja nicht z.B. die Adress-ID in ein array packen um so per "in_array" Doupletten auszufiltern (dann hätte ich ja in meiner query nie einen vernünftigen Start-Wert) -> ergo muß ich die Anzahl der korrekten Ergebnisse ja schon durch die query feststellen können, zumal ich denke das alle anderen Lösungen eher "not-quick-but-dirty" sind.
Gruss
Dieter
Mahlzeit Dieter,
Da aber ein Adressedatensatz auch mehrere Eigenschaften (also einzelne Datensätze in der Eigenschaften-DB) hat, funktioniert der SELECT via JOIN (leider) so, das er den Adressdatensatz so häufig selectiert, wie es hierzu Eigenschafteneinträge gibt. Das bedeutet, wenn z.B. ein Adressdatensatz 4 Eigenschaftensätze hat, das mir die query 4 x diese Adresse ausgibt -> was mir ja auch logisch erscheint, da die query ja ganz genau diese Anweisung hat.
Genau so ist es. Wenn Du pro Adresse nur ein Ergebnis haben möchtest, solltest Du vielleicht nach der Adress-ID gruppieren und ggf. entsprechende Aggregatsfunktionen für die Spalten aus der Eigenschaftstabelle nutzen.
Da ich aber die Ergebnisse der Query auf mehrere (Anzeige-)Seiten verteilen will, also nur x Ergebnisse pro Seite, kann ich ja nicht z.B. die Adress-ID in ein array packen um so per "in_array" Doupletten auszufiltern (dann hätte ich ja in meiner query nie einen vernünftigen Start-Wert) -> ergo muß ich die Anzahl der korrekten Ergebnisse ja schon durch die query feststellen können,
Das könntest Du z.B., indem Du Dir die Anzahl der mittels "DISTINCT" ermittelten eindeutig unterschiedlichen Werte ausgeben lässt.
MfG,
EKKi