nervig viele Subselects oder gibts doch ne Alternative? (mysql)
split.s
- datenbank
0 ChrisB0 split.s
1 Vinzenz Mai0 Vinzenz Mai0 split.s
Datenbank: mySQL
Was mich nervt ist, dass ich bei Subselects nur eine Spalte suchen kann!
Ich brauche aber mehrere!
Beispiel:
SELECT
themen.name
(SELECT name, datum, autor FROM beitraege WHERE thema_id = themen.id ORDER BY datum DESC LIMIT 1) AS beitrag_name, beitrag_datum, beitrag_autor
Mein Problem ist folgendes:
Ich habe ein Forum. Die Themen sind in der "themen"-Tabelle. Die Beiträge in "beitraege".
Nun will ich in der Themenübersicht "name, datum, autor" des letzten Beitrags. JOIN's scheiden hier wohl aus.
Hat hier jemand eine Idee?
Hi,
Ich habe ein Forum. Die Themen sind in der "themen"-Tabelle. Die Beiträge in "beitraege".
Nun will ich in der Themenübersicht "name, datum, autor" des letzten Beitrags. JOIN's scheiden hier wohl aus.
Warum sollten sie?
Das koennen wir erst beurteilen, wenn wir die genaue Datenstruktur kennen - und deinem Nein zu JOINs kann man sich dann vermutlich nur dann anschliessen, wenn dieses suboptimal sein sollte.
Was hast du denn in Sachen JOINen schon versucht?
MfG ChrisB
Ich weiss ja, dass ein INNER JOIN nur funktionieren würde, wenn in beitraege mindestens ein Beitrag vorhanden wäre. Muss aber in meinem Fall nicht sein. Außerdem: Wie lasse ich mir in einem JOIN ausgerechnet den LETZTEN Beitrag ausgeben? Beim LEFT JOIN wäre es egal ob ein Datensatz in beitraege existiert, aber auch dort kann ich nicht speziell den JOIN sortieren.
Die Datenbank sieht so aus:
themen:
id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
name VARCHAR(255) NOT NULL
beitraege:
id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
thema_id MEDIUMINT(8) UNSIGNED NOT NULL
datum DATETIME NOT NULL
content TEXT NOT NULL
Nochmal zum Verständnis:
Ich will alle Themen und jeweils den letzten Beitrag des Themas ausgeben.
Hallo,
Datenbank: mySQL
Version?
Was mich nervt ist, dass ich bei Subselects nur eine Spalte suchen kann!
Wieso? Natürlich kann man auch mehrere Spalten aus einem Subselect auswählen. Das ist überhaupt kein Problem.
Beispiel:
SELECT
themen.name
(SELECT name, datum, autor FROM beitraege WHERE thema_id = themen.id ORDER BY datum DESC LIMIT 1) AS beitrag_name, beitrag_datum, beitrag_autor
Das sieht nach einem völlig falschen Ansatz aus. Du suchst korrelierte Unterabfragen.
> Mein Problem ist folgendes:
> Ich habe ein Forum. Die Themen sind in der "themen"-Tabelle. Die Beiträge in "beitraege".
>
> Nun will ich in der Themenübersicht "name, datum, autor" des letzten Beitrags. JOIN's scheiden hier wohl aus.
Nein. Vermutlich nicht. Eine korrelierte Unterabfrage plus ein INNER JOIN. Ich sehe kein Problem, das ist Standard.
Nimm diesen [Archivbeitrag](/archiv/2006/7/t133015/#m861544) von mir. Er löst Dein Problem. Der einzige Unterschied: Statt einem Thema bekommst Du eine Themen-ID. Diese löst Du mit einem INNER JOIN zu Deiner themen-Tabelle auf.
Freundliche Grüße
Vinzenz
Hallo,
Nein. Vermutlich nicht. Eine korrelierte Unterabfrage plus ein INNER JOIN. Ich sehe kein Problem, das ist Standard.
Hab' übersehen, dass es eventuell noch keinen Beitrag geben könnte.
Nimm diesen Archivbeitrag von mir. Er löst Dein Problem. Der einzige Unterschied: Statt einem Thema bekommst Du eine Themen-ID. Diese löst Du mit einem INNER JOIN zu Deiner themen-Tabelle auf.
Korrektur: mit einem RIGHT JOIN zur themen-Tabelle bzw. mit einem LEFT JOIN von der themen-Tabelle zum Subselect.
LIMIT, ORDER BY und Konsorten taugen nichts für Deine Anforderung. Ansätze damit sind zum Scheitern verurteilt.
Freundliche Grüße
Vinzenz
Wieso? Natürlich kann man auch mehrere Spalten aus einem Subselect auswählen. Das ist überhaupt kein Problem.
Also ich bekomme dann immer
"Operand shout contain 1 column(s)".
Hier das Beispiel:
SELECT a.id,
(SELECT b.datum, b.content, b.sonstwas FROM themen b WHERE b.thema_id = a.id AND b.date = MAX(b.date))
Hallo,
Wieso? Natürlich kann man auch mehrere Spalten aus einem Subselect auswählen. Das ist überhaupt kein Problem.
Also ich bekomme dann immer
"Operand shout contain 1 column(s)".
SELECT a.id,
(SELECT b.datum, b.content, b.sonstwas FROM themen b WHERE b.thema_id = a.id AND b.date = MAX(b.date))
das ist ja auch falsch. Wo ist der LEFT JOIN?
Schreib' zuerst die Abfrage hin, die Dir mit Hilfe einer korrelierten Unterabfrage die Details zum neuesten Beitrag je Thema liefert.
Verknüpfe nun die Themen-Tabelle über einen LEFT JOIN zu dieser Abfrage, der Du einen Aliasnamen verpassen musst und aus der Du die Spalten auswählst die Du benötigst.
Wie das prinzipiell funktioniert, findest Du zum Beispiel in diesem Archivbeitrag.
Freundliche Grüße
Vinzenz