MySQL Subselect soll mehrere Werte ermitteln
Schorsch
- datenbank
Hallo,
ich habe eine DB-Tabelle mit Namen und eine mit Orten. In der Namnestabelle gibt es das Feld ort_id.
Wenn zur ort_id ein Ort vorhanden ist, möchte ich die Postleitzahl und den Namen. So geht es aber nicht:
SELECT *
,(SELECT plz, name
FROM orte ort1
WHERE ort1.id = adr1.ort_id ) plz, ortsname
FROM adressen adr1
Muss ich mich pro Subselect auf einen Wert beschränken? Also für jeden einzelnen Wert einen eigenen Subselect machen? Kann doch nicht sein.
Hi,
probier's mal mit "Joins".
~dave
probier's mal mit "Joins".
Geile Idee - die will ich gerade ablösen, weil die Laufzeit zu lang ist. JOINS potenzieren die gefundenen Datensätze, das muss man mit GROUP BY wieder berichtigen.
Schorsch
Hallo,
probier's mal mit "Joins".
Geile Idee - die will ich gerade ablösen, weil die Laufzeit zu lang ist. JOINS potenzieren die gefundenen Datensätze, das muss man mit GROUP BY wieder berichtigen.
Vermutlich fehlende Indexe. Ein GROUP BY kann nur dann erforderlich sein, wenn es zu einer ort_id mehrere Einträge in Deiner Ortstabelle gibt. Dann läufst Du mit Deinem Subselect jedoch in die gleiche Falle.
Klar: es gibt jede Menge Orte, die über mehr als eine PLZ verfügen. Wenn diese die gleiche ort_id aufweisen, kannst Du darüber die PLZ sowieso nicht nachschlagen.
Das hier sollte ein typischer Fall für einen einfachen Join sein, der *sehr performant* abgearbeitet werden kann. Befrage EXPLAIN, warum das bei Dir nicht der Fall ist.
Erzähle uns mehr über Dein Tabellendesign und die Inhalte Deiner Tabellen.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Das hier sollte ein typischer Fall für einen einfachen Join sein, der *sehr performant* abgearbeitet werden kann. Befrage EXPLAIN, warum das bei Dir nicht der Fall ist.
Erzähle uns mehr über Dein Tabellendesign und die Inhalte Deiner Tabellen.
Danke dir.
Ich denke, das sprengt den Rahmen dieser bisher einfachen Frage, es sind im Original 5 JOINS. Und es müssen MIN- Werte gefunden werden.
Ich habe aus einem SQL-Kommando zwei gemacht. Das erste, um die MIN- Werte zu ermitteln, das zweite, um mit den ermittelten Werten die Sätze zu holen (incl. der 5 JOINS).
Und bin von 5 sec auf 0,15 sec Programmlaufzeit runter. Mein Problem hat sich erledigt, weil ich eine Vorauswahl treffe. Die JOINS blasen also nicht mehr die Satzanzahl auf.
MfG Schorsch
moin,
Die JOINS blasen also nicht mehr die Satzanzahl auf.
Joins sind böse ;-)
Ilja
Joins sind böse ;-)
Aber voll. Die sind so wie mein ehemaliger Kumpel Bernd Müller.
Wenn ich dem gasagt habe, "du bist zur Party eingeladen", hat der für jeden vorhandenen Partygast noch einen mitgebracht. So viel Gatränke kann ja kein Mensch ranschaffen.
Deshalb auch "ehemaliger".
Wenn ich dem gasagt habe, "du bist zur Party eingeladen", hat der für jeden vorhandenen Partygast noch einen mitgebracht.
das geht ja noch, eine freundin von mir hat gleich vier weitere mitgebracht.....
Ilja
Hi,
Wenn zur ort_id ein Ort vorhanden ist, möchte ich die Postleitzahl und den Namen. So geht es aber nicht:
Dann verknüpf beide Tabellen mit einem Join
Muss ich mich pro Subselect auf einen Wert beschränken? Also für jeden einzelnen Wert einen eigenen Subselect machen? Kann doch nicht sein.
Ja musst Du
Aber wie erwähnt, kannst Du das ganze anders handhaben
SELECT a.*, plz, name
FROM adressen a LEFT OUTER JOIN ort1 ON o.ort_id = a.ort_id
schau Dir das ganze mal hier JOINS an