4 messages in com.mysql.lists.mysql-deRe: Probleme bei einer Query
FromSent OnAttachments
Tim14 Nov 2006 04:31 
Felix Antonius Wilhelm Ostmann14 Nov 2006 05:38 
Daniel Penning14 Nov 2006 06:28 
Tim15 Nov 2006 06:46 
Subject:Re: Probleme bei einer Query
From:Daniel Penning (in@daniel-penning.de)
Date:11/14/2006 06:28:21 AM
List:com.mysql.lists.mysql-de

Hi

Mit einem LEFT JOIN kann man das Problem lösen.

SELECT a.* FROM tab AS a LEFT JOIN tab AS b ON b.id=a.id AND b.status>a.status WHERE b.id IS NULL

Es werden einfach alle Datensätze selektiert und über den LEFT JOIN werden dann wieder die aussortiert zu denen es noch einen Datensatz mit einem höheren Status gibt.

Alternativ könnte man das auch als NOT EXISTS() schreiben:

SELECT a.* FROM tab AS a WHERE NOT EXISTS(SELECT * FROM tab AS b WHERE b.id=a.id AND b.status>a.status)

Daniel

Felix Antonius Wilhelm Ostmann schrieb:

Ich glaube ne richtig tolle Lösung gibt es da nicht, hatte vor längerer Zeit auch einmal ein ähnliches Problem und konnte es leider nur "schwammig" lösen.

Ich meine das ich es über Subselects gelöst hatte und mit der Performance sehr unzufrieden war und derzeit das anders aufbaue: Ich hab eine Tabelle_current und eine Tabelle_archive, immer wenn ich neue Daten bekomme haue ich sie in archive rein und in current rein, wobei ich in current halt überschreibe.

Das mit den Subselect sah ca. so aus:

SELECT * FROM t1 LEFT JOIN t2 t1.id=t2.foreign_id AND t2.status = (SELECT MAX(status) FROM t2 AS tegal WHERE tegal.foreign_id=t2.foreign_id)

Bin mir da aber gerade überhaupt nicht sicher :( kann auch sein das ich es über HAVING gemacht habe? *grübel* Naja, vielleicht gibts hier ja nen schlauen Kopf, der weiß wie es "richtig" geht :)

Tim schrieb:

Hallo zusammen,

ich habe doch noch mal ein Problem mit einer SQL-Query und wollte mal höflich nachfragen, ob mir da vielleicht jemand auf die Sprünge helfen kann.

Also ich habe zwei Tabellen, die in einer 1:n Beziehung stehen. In der N-Tabelle befinden sich Datensätze, die einen aufsteigenden Status besitzen. Ein Beispiel:

1-Tabelle: id data1 data2 ...

1 xxx nnn 2 nnn fff

N-Tabelle: if foreign_id status [...]

1 1 1 2 1 2 3 1 3 4 2 1 5 2 2

In der N-Tabelle gibt es also einen maximalen Status von 3 für 1-Datensatz mit ID 1 und einen maximalen Status von 2 für den 1-Datensatz mit der ID 2

Was ich nun schon länger versuche, ist eine Join-Verknüpfung aufzusetzen, die mir jeweils immer nur die Daten für den maximalen Status rauswirf.

Also

SELECT 1-Tabelle.* FROM 1-Tabelle as A INNER JOIN 2-Tabelle as B ON A.id = B.foreign_id -> Holt mir alle Datensätze und zeigt einzelne Zeilen aus der 1-Tabelle mehrfach an

SELECT 1-Tabelle.* FROM 1-Tabelle as A INNER JOIN 2-Tabelle as B ON A.id = B.foreign_id GROUP BY A.id -> Zeigt die Daten der 1-Tabelle nur einmal an, hat aber die Inhalte der N-Tabelle mit dem niedrigsten Status, was ich aber gerade nicht brauche...

Wie also könnte ich die Query so umschreiben, dass ich immer nur die Daten der N-Datensätze mit dem jeweils maximalsten Status bekomme?