Abfrageproblem Group By Sortierung

Abfrageproblem Group By Sortierung

am 22.12.2006 14:51:49 von Tobias

Hallo,

ich habe ein Problem mit der Sortierung einer Abfrage.
MySQL Version: 3.23.58


Tabelle Rechnungen:
rid datum prj_id details1 details2 liefer_id
1 20050518 3 test1 test2 1
2 20051203 3 test3 test4
3 20051013 2 test5 test6
4 20060523 1 test7 test8 3

Tabelle Projekt:
prj_id bezeichnung
1 bez1
2 bez2
3 bez3

Tabelle Lieferant:
liefer_id name
1 lieferant1
3 lieferant3

Als Ergebnis der Abfrage möchte ich nun alle prj_ids gruppieren und
immer die neueste Rechnung (nach Datum mit den entsprechenden Detials
anzeigen).
Zudem sollte die neueste Rechnung des Ergebnisses ganz oben stehen.

Ergebnis sollte folgendermassen aussehen:

rid datum prj_id prj_bezeichnung details1 details2 lieferant
4 20060523 1 bez1 test7 test8 lieferant3
2 20051203 3 bez3 test3 test4 NULL
3 20051013 2 bez2 test5 test6 NULL

Meine Abfrage:

SELECT max(datum) as datum_max,details1,details2,rid,lieferant.name as
lieferant ,datum,projekt.bezeichnung as prj_bezeichnung
FROM rechnungen
LEFT JOIN lieferant ON rechnungen.liefer_id=lieferant.liefer_id
LEFT JOIN projekt ON projekt.prj_id=rechnungen.prj_id
GROUP BY rechnungen.prj_id ORDER BY datum_max DESC

Lieder bekomme ich bei der Abfrage nicht die neueste Rechnung zum
Projekt angezeigt sondern immer die erste Rechnung innerhalb der Tabelle
Rechnungen die zur Projekt ID passt.

Da ich keine Unterabfragen in dieser MySQL Version machen kann muss ich
eine Alternative finden.
Am liebsten wäre es mir das ganze mit einer einzigen Abfrage zu lösen.

Kann mir hier jemand helfen?

Danke im Voraus,
Gruss

Tobias

Re: Abfrageproblem Group By Sortierung

am 22.12.2006 23:45:06 von Dominik Echterbruch

Tobias wrote:
>
> ich habe ein Problem mit der Sortierung einer Abfrage.

Nein, eigentlich nicht.

[Tabellendefinitionen]
> Als Ergebnis der Abfrage möchte ich nun alle prj_ids gruppieren und
> immer die neueste Rechnung (nach Datum mit den entsprechenden Detials
> anzeigen).
> Zudem sollte die neueste Rechnung des Ergebnisses ganz oben stehen.

Das Problem dabei ist eine Eigenheit von MySQL: Spalten, die nicht
aggregiert werden, müssen nicht zwingend gruppiert werden. Das ist eine
feine Sache, wenn man weiß, was man tut und genau dieses Verhalten haben
möchte. Aber in deinem Fall hat es wohl eher zu Verwirrung geführt (der
Hauptgrund, warum die meisten anderen DBMSe darauf bestehen).

Was du möchtest, ist in etwa dieses hier (ungetestet):
SELECT r1.rid, r.datum, p.prj_id, r.details1, r.details2, l.name
FROM rechnungen r1
LEFT JOIN rechnungen r2 ON r2.datum < r1.datum
LEFT JOIN projekt p ON p.prj_id = r1.prj_id
LEFT JOIN lieferant l ON l.liefer_id = r.liefer_id
WHERE r2.datum IS NULL

Eventuell mußt du da noch ein bißchen dran drehen, damit es richtig
funktioniert, aber ich hoffe, du hast die Idee dahinter verstanden. Wenn
nicht: fragen :)

> Ergebnis sollte folgendermassen aussehen:
>
> rid datum prj_id prj_bezeichnung details1 details2 lieferant
> 4 20060523 1 bez1 test7 test8 lieferant3
> 2 20051203 3 bez3 test3 test4 NULL
> 3 20051013 2 bez2 test5 test6 NULL

Wenn ich mir deine Tabellen anschaue, dann eher nicht ;)
Aber ich verstehe, was du meinst.

> Lieder bekomme ich bei der Abfrage nicht die neueste Rechnung zum
> Projekt angezeigt sondern immer die erste Rechnung innerhalb der Tabelle
> Rechnungen die zur Projekt ID passt.

Das ist klar. Genau das hast du MySQL ja aufgetragen, weil du die
übrigen Spalten nicht gruppierst.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Abfrageproblem Group By Sortierung

am 23.12.2006 15:11:32 von Claus Reibenstein

Dominik Echterbruch schrieb:

> LEFT JOIN rechnungen r2 ON r2.datum < r1.datum

Das geht? Bis jetzt habe ich LEFT JOIN ON immer nur im Zusammenhang mit
dem '='-Operator gesehen.

Gruß. Claus
--
) )
(,) Ich wünsche allen Mitlesern (,)
__|__ ein gesegnetes Weihnachtsfest __|__
| | | |

Re: Abfrageproblem Group By Sortierung

am 23.12.2006 16:33:11 von Tobias

Hallo Dominik,

danke für Deine schnelle Antwort.

Dominik Echterbruch schrieb:
> Eventuell mußt du da noch ein bißchen dran drehen, damit es richtig
> funktioniert, aber ich hoffe, du hast die Idee dahinter verstanden. Wenn
> nicht: fragen :)

Ich habe Deinen Vorschlag angepasst.

SELECT r1.rgid, r1.datum, r2.datum, r1.projekt_id, r2.projekt_id,
r1.eingangsrechnung, r1.rechnungsnummer, r1.lieferant_id
FROM rechnungen r1
LEFT JOIN rechnungen r2 ON r2.datum > r1.datum
WHERE r2.datum IS NULL

Das Funktioniert soweit ganz gut ich bekomme auch eine Rechnung (die
neueste).
Es erscheint allerdings nur 1 Rechnung zu einem Projekt Nr. 3.

Ich benötige aber zu jeder Projekt ID (prj_id) die neueste Rechnung.
Wie kann ich das noch hinbekommen.

Danke im Voraus,

Tobias

Re: Abfrageproblem Group By Sortierung

am 25.12.2006 04:42:39 von Dominik Echterbruch

Claus Reibenstein wrote:
>
>>LEFT JOIN rechnungen r2 ON r2.datum < r1.datum
>
> Das geht? Bis jetzt habe ich LEFT JOIN ON immer nur im Zusammenhang mit
> dem '='-Operator gesehen.

Sehen heißt nicht wissen. Oder so ähnlich ;)
Du kannst im ON Statement beliebige Ausdrücke verwenden, die einen
Bool'schen Wert liefern. Ob das nun ein < oder ein BETWEEN oder sonst
was ist, ist vollkommen egal. Es muß nur am Ende ein logischen Ja, Nein
oder NULL ergeben.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Abfrageproblem Group By Sortierung

am 25.12.2006 04:55:04 von Dominik Echterbruch

Tobias wrote:
>
> SELECT r1.rgid, r1.datum, r2.datum, r1.projekt_id, r2.projekt_id,
> r1.eingangsrechnung, r1.rechnungsnummer, r1.lieferant_id
> FROM rechnungen r1
> LEFT JOIN rechnungen r2 ON r2.datum > r1.datum
> WHERE r2.datum IS NULL
>
> Das Funktioniert soweit ganz gut ich bekomme auch eine Rechnung (die
> neueste).
> Es erscheint allerdings nur 1 Rechnung zu einem Projekt Nr. 3.
>
> Ich benötige aber zu jeder Projekt ID (prj_id) die neueste Rechnung.
> Wie kann ich das noch hinbekommen.

Ah, richtig. Flüchtigkeitsfehler von mir. Mit
ON r1.projekt_id = r2.projekt_id AND r2.datum > r1.datum
solltest du die richtigen Zeilen bekommen.
Das ganze funktioniert deshalb, weil IM ON noch keine Zeilen verworfen
wurden. Im WHERE Teil der Abfrage kannst du auf diese Werte aber schon
nicht mehr zugreifen.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Abfrageproblem Group By Sortierung

am 26.12.2006 15:10:00 von Tobias

Hallo Dominik,

vielen Dank für Deine schnelle Hilfe.

Dominik Echterbruch schrieb:
> Ah, richtig. Flüchtigkeitsfehler von mir. Mit
> ON r1.projekt_id = r2.projekt_id AND r2.datum > r1.datum
> solltest du die richtigen Zeilen bekommen.
> Das ganze funktioniert deshalb, weil IM ON noch keine Zeilen verworfen
> wurden. Im WHERE Teil der Abfrage kannst du auf diese Werte aber schon
> nicht mehr zugreifen.

Funktioniert super.

Danke,

Tobias