Subselect bzw. Inner Join <-> Arraylänge
krapfen
- datenbank
Hallo Forum,
ich habe zwei Tabellen (Auktionen und Gebote)
Auktion
(auktionsid beschreibung ablaufdatum)
(2, Maus, 2007-05-05)
Gebote
(aktionsid userid gebot)
(2, 111, 50)
Früher hatte ich zusätzlich den Höchstbieter und das Höchstangebot in die Tabelle "Auktion" abgespeichert, das mächte ich aber nun vermeiden.
Durch die zwei Tabellen möchte ich nun in ein Array die Beschreibung, das Datum sowieo den Höchstbieter einlesen.
select A.beschreibung, A.ablaufdatum, B.userid...
Das alles dürfte klappen, wenn ein Eintrag in der Tabelle "Gebote" vorhanden ist. Wie sieht es eigentlich aus,
wenn keine Gebote vorhanden sind, könnte man dann durch die Query mein Array mit irgendeinem Wert belegen, falls keine Gebote vorhanden sind. (Damit meine Arraylänge immer gleich ist)
Grüße
Hallo,
Das alles dürfte klappen, wenn ein Eintrag in der Tabelle "Gebote" vorhanden ist. Wie sieht es eigentlich aus,
wenn keine Gebote vorhanden sind, könnte man dann durch die Query mein Array mit irgendeinem Wert belegen, falls keine Gebote vorhanden sind. (Damit meine Arraylänge immer gleich ist)
Dir dürften ein OUTER JOIN und korrelierte Subselects weiterhelfen.
Freundliche Grüße
Vinzenz
Ich habe mir das mal durchgelesen, das mit dem Joins habe ich fast so gut wie drauf. Meine Anwendung klappt zumindest, die Felder die er durch Jin holt, werden mit NULL aufgefüllt, falls kein Treffer gelandet wurde.
Das ist optimal ;) Mit den Sub-Selects checke ich es noch nicht so.
Grüße
hi vinzenz, danke für die tipps.
hättest du ein link in deutscher sprache, da ich das mit den "Correlated Subqueries" nicht verstanden habe. Beispiele wären nicht schlecht.
Wäre echt super, wenn du bei gelegenheit (nur wenn du zeit hast und es dir langweilig ist) mir ein beispiel mit kommentaren aufzeigen könntest.
(Wie ungefähr im Beispiel: http://forum.de.selfhtml.org/archiv/2007/9/t158683/)
mfg
Hallo
hi vinzenz, danke für die tipps.
aber bitte, gerne.
hättest du ein link in deutscher sprache, da ich das mit den "Correlated Subqueries" nicht verstanden habe. Beispiele wären nicht schlecht.
Wäre echt super, wenn du bei gelegenheit (nur wenn du zeit hast und es dir langweilig ist) mir ein beispiel mit kommentaren aufzeigen könntest.
reichen folgende Archivbeiträge?
</archiv/2007/1/t143558/#m932327>
</archiv/2006/7/t133015/#m861544>
</archiv/2007/9/t159152/#m1035527>
Freundliche Grüße
Vinzenz
hi, sorry war übers wochenende ende nicht, deshalb die verspätete antwort. ich schau mir die links alle gleich einzeln an.
In der Zeit meine Frage:
Erstmal danke für Eure Tipps und Hilfestellungen. Mit einer korrelierten Unterabfrage kann man ja im where-teil durch eine zweite abfrage das suchergebnis einschränken. Das ist mir jetzt einwenig klar geworden:-)
Ich habe nun auch mein vorhaben mit Joins einwenig getestet und bin da doch auf eine Hürde gstoßen.
Nämlich:
Tabelle: Auktion
(auktionsid beschreibung ablaufdatum aktiv)
(2, Maus, 2007-05-05, 1)
Tabelle: Gebote
(aktionsid userid gebot)
(2, 111, 50)
(2, 112, 40)
(2, 113, 30)
(2, 114, 20)
Tabelle: user
(userid username)
(111 ursula)
Meine Sorge ist nicht, dass er immer einen Datensatz holen muss, sondern, dass der Datensatz immer gleich lang (Gleichviele Spalten) haben muss,
egal ob in der Tabelle "Gebot" schon ein Gebot abgegeben wurde oder nicht.
Erst hatte ich dies:
select A.beschreibung, B.userid, B.gebot from Auktion AS A LEFT JOIN Gebote AS B on A.auktionsid=B.auktionsid where A.aktiv=1;
Klappt soweit so gut. Meine Arraylänge ist immer 3 Felder lang. Wenn es keine Gebote geben würde, wären für die Spalten B.userid und B.gebot im Datensatz eine "NULL" eingtragen.
Nun habe ich angenommen wir oben 4 Gebote vorliegen. Da fängt schon mein Problem an. Wende ich die Query von oben anwende, erhalte ich unnötig 4 Datensätze als Ergebnis.
Das ganze wollte ich nun optimieren.
Erst habe ich mir überlegt das ganze zu gruppieren, nur kann ich dann nicht nach dem Hochstgebot sortieren:
select A.beschreibung, B.userid, B.gebot from Auktion AS A LEFT JOIN Gebote AS B on A.auktionsid=B.auktionsid where A.aktiv=1 group by A.auktionsid order by B.gebot desc;
Hier habe ich zwar dann nur noch ein Datensatz, aber nicht mehr das Hochstgebot, sondern nur willkürlich ein Gebot vorliegen.
Was mache ich da falsch?
Wenn ich das geklärt habe, will ich in der Query noch die Spalte C.Username holen.
yo,
Durch die zwei Tabellen möchte ich nun in ein Array die Beschreibung, das Datum sowieo den Höchstbieter einlesen.
ich bevorzuge in solch einen falle den OUTER JOIN zu verhindern und nur die tabelle auktionen als basis zu nehmen. das hat den vorteil, dass die anzahl der ergebnismenge immer stimmig ist. ich bekomme pro auktion auch nur einen datensatz zurück.
das einzige, was du noch tun musst, ich die id und gebot des höchtbietenden hinzu zu fügen. und da hat dir Vinz schon den tipp gegeben, korrelierte unterabfragen einzusetzen. dabei ist zu beachten, ob es mehrere höchste gebote geben kann.
Ilja