subselect und best-of

subselect und best-of

am 16.10.2006 09:07:06 von Werner Bauer

Ich suche die jeweils letzte Bewegung zu Artikeln. (Die Artikeldaten=20
zusammen mit der jeweils Datums-letzten Beleg-nr, ... und weiteren Daten =

des Beleges) also ausdrücklich nicht sowas wie max(beleg_nr)

also etwa - und genau das funktioniert nicht - so ...

select a.*, b.beleg_nr
from tab_artikel a
join (select b.beleg_nr from tab_bewegung b where=20
b.artikel_id=3Da.artikel_id order by b.datum desc limit 0,1)
where a.eigner_id=3D4711

(in Wirklichkeit ist es noch etwas komplexer, weil b auch aus=20
zusammengejointen Tabellen besteht)

Wurde sicher schn das eine oder andere mal besprochen, aber ich such'=20
vermutlich unter den falschen Begriffen ...

Werner

Re: subselect und best-of

am 16.10.2006 11:38:39 von Johannes Vogel

Hi Werner

werner bauer wrote:
> Ich suche die jeweils letzte Bewegung zu Artikeln. (Die Artikeldaten
> zusammen mit der jeweils Datums-letzten Beleg-nr, ... und weiteren Daten
> des Beleges) also ausdrücklich nicht sowas wie max(beleg_nr)

Ich verstehe nicht, was du möchtest. Du verwendest viel Platz für die
Beschreibung, was nicht funktioniert (wobei du nicht erwähnst, weshalb
nicht). Schreib doch bitte ganz genau, was du haben möchtest.

Layout und Ergebniswunsch...

Johannes

Re: subselect und best-of

am 16.10.2006 12:35:33 von Werner Bauer

Johannes Vogel schrieb:
> werner bauer wrote:
>> Ich suche die jeweils letzte Bewegung zu Artikeln. (Die Artikeldaten
>> zusammen mit der jeweils Datums-letzten Beleg-nr, ... und weiteren Dat=
en
>> des Beleges) also ausdrücklich nicht sowas wie max(beleg_nr)
>=20
> Ich verstehe nicht, was du möchtest.=20

Artikel:
artikel_id, bezeichnung, ...

Belegzeilen:
belegzeile_id, beleg_id, belegtyp, beleg_nr, beleg_datum, artikel_id ...

Nun suche ich alle Artikel mit a%, und deren letzte Beleg_id

gesuchtes Ergebnis:
artikel_id, bezeichnung, beleg_id(des letzten Beleges), belegtyp(des=20
letzten Beleges), beleg_datum(des letzten Beleges) ...

Natürlich kann ich zu jedem einzelnen Artikel die letzte Belegzeile=20
finden (und zB im Mysql könnte ich also für jeden Artikel nochmal ein=
e=20
Abfrage starten, die die letzte Belegzeile findet):
select b.* from belegzeilen where artikel_id=3D4711 order by beleg_datum =

desc limit 0,1

aber ich möchte gern dieses Subselect für alle Artikel, die ... in ei=
nem=20
Rutsch ermitteln.

Und wahrscheinlich finde ich im Web keine Lösung, weil ich die=20
Problemstellung nicht gut erklär' ...

Werner.

Re: subselect und best-of

am 16.10.2006 12:41:18 von Claus Reibenstein

werner bauer schrieb:

> Artikel:
> artikel_id, bezeichnung, ...
>
> Belegzeilen:
> belegzeile_id, beleg_id, belegtyp, beleg_nr, beleg_datum, artikel_id ...
>
> Nun suche ich alle Artikel mit a%, und deren letzte Beleg_id

Was meinst Du mit "a%"? Alle Artikel, deren Bezeichnungen mit "a" beginnen?

> gesuchtes Ergebnis:
> artikel_id, bezeichnung, beleg_id(des letzten Beleges), belegtyp(des
> letzten Beleges), beleg_datum(des letzten Beleges) ...

SELECT ... max(beleg_datum) ...

Gruß. Claus

Re: subselect und best-of

am 16.10.2006 12:47:24 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: subselect und best-of

am 16.10.2006 13:34:22 von Werner Bauer

Andreas Kretschmer schrieb eine echt nette Detaillierung, aber die=20
trifft mein Problem gar nicht.

Weil man mit max(Datum) zwar das maximum vom Datum bekommt, aber nicht=20
dazu die anderen Felder das Datensatzes mit dem maximalen Datum.

Das was ich ursprünglich gepostet hatte, nämlich ein Join mit einem=20
Subselect, welches
(nur) den ersten passenden Datensatz aus dem Bewegungen-table bringt
hat für mich die Sache immer noch am Besten erklärt, aber ich probier=
s=20
hier nochmal anhand eines Beispiels vom Andreas

> test=3D*# select * from artikel;
> id | name
> ----+-----------
> 1 | artikel a
> 2 | artikel b
> (2 rows)
>
> test=3D*# select * from beleg;
> a_id | datum | belegnr | hiweis
> ------+----------------------------------
> 1 | 2006-10-01 | 1001 | hinweis 1
> 1 | 2006-10-02 | 995 | hinweis 2
> 1 | 2006-10-03 | 101 | hinweis-3
> 2 | 2006-10-04 | 4711 | hinweis-4
> 2 | 2006-10-01 | 9999 | hinweis-5
> (4 rows)

Ergebnis sollte sein:

1 artikel-a | 2006-10-03 | 101 | hinweis-3
2 artikel-b | 2006-10-04 | 4711 | hinweis-5

Danke schon mal für die Mühe ...

Werner

Re: subselect und best-of

am 16.10.2006 13:34:48 von Werner Bauer

Claus Reibenstein schrieb:

> Was meinst Du mit "a%"? Alle Artikel, deren Bezeichnungen mit "a" beginnen?
ja ...

>> gesuchtes Ergebnis:
>> artikel_id, bezeichnung, beleg_id(des letzten Beleges), belegtyp(des
>> letzten Beleges), beleg_datum(des letzten Beleges) ...
>
> SELECT ... max(beleg_datum) ...

aber nein - so kriegt man das max vom Datum, oder das max von der
Belegnummer, aber sicher nicht _die_ letzte Belegnummer mit ihrem Datum
und ihrem Typ.

Werner.

Re: subselect und best-of

am 16.10.2006 13:59:33 von Werner Bauer

werner bauer schrieb:
> 2 artikel-b | 2006-10-04 | 4711 | hinweis-5
oops, tippfehler auch noch ..
> 2 artikel-b | 2006-10-04 | 4711 | hinweis-4

Re: subselect und best-of

am 16.10.2006 14:43:00 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: subselect und best-of

am 16.10.2006 17:18:43 von Werner Bauer

Andreas Kretschmer schrieb:
> test=3D*# select beleg.id, a_id, datum, a.name from beleg left join art=
ikel a on a_id=3Da.id where (a_id, datum) in (select a_id, max(datum) fro=
m beleg group by a_id);

Ja klar. Nennt man Vekroren? oder so, und ich glaub, Mysql kann es=20
nicht. Aber sicher kann ich die beiden Felder conCATen und so=20
vergleichen, oder besser mit einem join werkeln.

> Das ganze knallt, wenn an einem Tag(datum) mehr als ein Beleg für ein=
en Kunden existiert.

Genau. Und die gibt es.

Mit Umstellung des Datums auf Datetime wird es (für die praktische=20
Anwendung) gehen. Und ich könnte die ID nehmen, wenn die fortlaufend=20
ist. Wird auch gehen.

Aber ich bin mir sicher, mal irgendwo eine Lösung gesehen zu haben, die=
=20
auf Sortierung und Limit beruht .

Noch Ideen?

Re: subselect und best-of

am 17.10.2006 19:44:12 von newsgroup

werner bauer schrieb:
> Andreas Kretschmer schrieb:
>
>> test=*# select beleg.id, a_id, datum, a.name from beleg left join
>> artikel a on a_id=a.id where (a_id, datum) in (select a_id, max(datum)
>> from beleg group by a_id);
>
>
> Ja klar. Nennt man Vekroren? oder so, und ich glaub, Mysql kann es
> nicht. Aber sicher kann ich die beiden Felder conCATen und so
> vergleichen, oder besser mit einem join werkeln.
>
>> Das ganze knallt, wenn an einem Tag(datum) mehr als ein Beleg für
>> einen Kunden existiert.
>
>
> Genau. Und die gibt es.
>
> Mit Umstellung des Datums auf Datetime wird es (für die praktische
> Anwendung) gehen. Und ich könnte die ID nehmen, wenn die fortlaufend
> ist. Wird auch gehen.
>
> Aber ich bin mir sicher, mal irgendwo eine Lösung gesehen zu haben, die
> auf Sortierung und Limit beruht .
>
> Noch Ideen?
>

Und wieso möchtest Du das?

order by spalte desc limit 0,1 ist nichts anderes
als max(spalte) und alle DBMS, die ich kenne sind damit deutlich
schneller, als mit einem Sortieren und danach fast alles wegwerfen ...

Wenn MySql keine Vektorn kann, dann nimm doch

select b1.id, b1.a_id, datum, a.name from beleg as b1,artikel as a
where datum = ( select max(datum) from beleg as b2 where b2.a_id = a.id
) and a.id = b1.a_id;

Gruß,
Michael