dbTalk Databases Forums  

Komplizierte Sortierung

comp.databases.mysql comp.databases.mysql


Discuss Komplizierte Sortierung in the comp.databases.mysql forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Thomas Gehrmann
 
Posts: n/a

Default Komplizierte Sortierung - 10-28-2011 , 07:49 AM






Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011, die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden, wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Viele Grüße
Thomas

Reply With Quote
  #2  
Old   
Tony Mountifield
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-28-2011 , 08:41 AM






In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Quote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011, die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden, wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?
Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
  #3  
Old   
Thomas Gehrmann
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-28-2011 , 09:39 AM



Hi Tony,
mag sein, dass dein deutsch nicht perfekt ist, deine Lösung hingegen kommt
dem schon sehr nahe :-)
Hab ganz herzlichen Dank.

So sieht das Ergebnis dann mit den echten Daten aus, um die es geht:
http://www.arbeitszeitberatung.de/04...ngen/test.aspx

Das ist wirklich nahezu perfekt. Aber es gibt seltsamerweise zwei
Veranstaltungen, die sich nicht an die Sortierung halten, nämlich

Tages-Seminar
Optimierung der Abläufe im OP
07.05.2012, Hannover

und

Tages-Seminar
Vertrauensarbeitszeit - Gestaltungsperspektiven und Umsetzung
14.11.2012, Berlin

Diese beiden Veranstaltungen müssten weiter unten einsortiert werden. Ich
kann mir irgendwie nicht erklären, warum es bei denen nicht klappt, bei
allen anderen aber schon.

Schau mal, so sieht jetzt der echte SQL-String aus. Fällt dir daran
vielleichte etwas auf, woran es liegen könnte:
strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb ON webdb.Titel=t.Titel ORDER BY
Mindatum,Datum1"

Die Tabelle enthält übrigens nur die 38 Datensätze und viel mehr werden aus
auch nicht (maximal vielleicht 50).

Auf jeden Fall schon mal vielen, vielen Dank
Thomas





"Tony Mountifield" <tony (AT) mountifield (DOT) org> schrieb im Newsbeitrag
news:j8ebes$n4o$1 (AT) softins (DOT) clara.co.uk...
Quote:
In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie
ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt
wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die
zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen
Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen
Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011, die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum
als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen
des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis
sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden,
wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine
der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
  #4  
Old   
Tony Mountifield
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-28-2011 , 09:54 AM



Hi Thomas,

Kannst Du mir zeigen die tatsächliche CREATE TABLE für webdb?
Was Datentyp ist Datum1?

Tony

In article <j8eeqn$9ih$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Quote:
Hi Tony,
mag sein, dass dein deutsch nicht perfekt ist, deine Lösung hingegen kommt
dem schon sehr nahe :-)
Hab ganz herzlichen Dank.

So sieht das Ergebnis dann mit den echten Daten aus, um die es geht:
http://www.arbeitszeitberatung.de/04...ngen/test.aspx

Das ist wirklich nahezu perfekt. Aber es gibt seltsamerweise zwei
Veranstaltungen, die sich nicht an die Sortierung halten, nämlich

Tages-Seminar
Optimierung der Abläufe im OP
07.05.2012, Hannover

und

Tages-Seminar
Vertrauensarbeitszeit - Gestaltungsperspektiven und Umsetzung
14.11.2012, Berlin

Diese beiden Veranstaltungen müssten weiter unten einsortiert werden. Ich
kann mir irgendwie nicht erklären, warum es bei denen nicht klappt, bei
allen anderen aber schon.

Schau mal, so sieht jetzt der echte SQL-String aus. Fällt dir daran
vielleichte etwas auf, woran es liegen könnte:
strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb ON webdb.Titel=t.Titel ORDER BY
Mindatum,Datum1"

Die Tabelle enthält übrigens nur die 38 Datensätze und viel mehr werden aus
auch nicht (maximal vielleicht 50).

Auf jeden Fall schon mal vielen, vielen Dank
Thomas





"Tony Mountifield" <tony (AT) mountifield (DOT) org> schrieb im Newsbeitrag
news:j8ebes$n4o$1 (AT) softins (DOT) clara.co.uk...
In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie
ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt
wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die
zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen
Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen
Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011, die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum
als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen
des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis
sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden,
wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine
der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org


--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
  #5  
Old   
Thomas Gehrmann
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-28-2011 , 10:00 AM



Hallo noch einmal, Tony,
ich hatte das Problem auch in einer anderen Newsgroup gepostet. Dort habe
ich jetzt eine Antwort bekommen, die deiner sehr ähnlich ist, bei der aber
wirklich alle Daten korrekt sortiert werden.

Der String sieht dann so aus:
strSQL = "SELECT * FROM webdb ta ORDER BY (SELECT MIN(datum1) FROM webdb tb
WHERE tb.titel = ta.titel GROUP BY tb.titel), ta.titel, ta.datum1"

und so das Ergebnis:
http://www.arbeitszeitberatung.de/04...gen/test2.aspx

Ich verstehe ehrlich gesagt nicht wirklich, was da genau den Unterschied
ausmacht, bin aber auf jeden Fall froh, jetzt die perfekte Lösung zu haben.

Also ganz herzlichen Dank noch einmal.
Viele Grüße
Thomas



"Thomas Gehrmann" <webmaster (AT) arbeitszeitberatung (DOT) de> schrieb im Newsbeitrag
news:j8eeqn$9ih$1 (AT) online (DOT) de...
Quote:
Hi Tony,
mag sein, dass dein deutsch nicht perfekt ist, deine Lösung hingegen kommt
dem schon sehr nahe :-)
Hab ganz herzlichen Dank.

So sieht das Ergebnis dann mit den echten Daten aus, um die es geht:
http://www.arbeitszeitberatung.de/04...ngen/test.aspx

Das ist wirklich nahezu perfekt. Aber es gibt seltsamerweise zwei
Veranstaltungen, die sich nicht an die Sortierung halten, nämlich

Tages-Seminar
Optimierung der Abläufe im OP
07.05.2012, Hannover

und

Tages-Seminar
Vertrauensarbeitszeit - Gestaltungsperspektiven und Umsetzung
14.11.2012, Berlin

Diese beiden Veranstaltungen müssten weiter unten einsortiert werden. Ich
kann mir irgendwie nicht erklären, warum es bei denen nicht klappt, bei
allen anderen aber schon.

Schau mal, so sieht jetzt der echte SQL-String aus. Fällt dir daran
vielleichte etwas auf, woran es liegen könnte:
strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb ON webdb.Titel=t.Titel ORDER BY
Mindatum,Datum1"

Die Tabelle enthält übrigens nur die 38 Datensätze und viel mehr werden
aus auch nicht (maximal vielleicht 50).

Auf jeden Fall schon mal vielen, vielen Dank
Thomas





"Tony Mountifield" <tony (AT) mountifield (DOT) org> schrieb im Newsbeitrag
news:j8ebes$n4o$1 (AT) softins (DOT) clara.co.uk...
In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss
das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie
ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In
der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt
wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die
zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen
Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen
Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011,
die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum
als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen
des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis
sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden,
wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine
der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
  #6  
Old   
Tony Mountifield
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-28-2011 , 10:43 AM



Hi Thomas,

Ich glaube, dass die zweite Antwort nicht so sparsam ist, weil es eine
SELECT für jede Reihe machen muss (ORDER BY). Wenn die Tabelle gross
wird, läuft es vielleicht langsam.

Vielleicht ist der MySQL-Server verwirrt wegen der zwei "webdb" Tabellen.
Bitte versuche auch diese Query:

strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb w2 ON w2.Titel=t.Titel ORDER BY
Mindatum,w2.Datum1"

Ich habe "w2" eingefügt, um deutlich zu sein.

Wenn dass nicht korrekt läuft, bin ich da überfragt!

MfG,
Tony

In article <j8eg20$aiq$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Quote:
Hallo noch einmal, Tony,
ich hatte das Problem auch in einer anderen Newsgroup gepostet. Dort habe
ich jetzt eine Antwort bekommen, die deiner sehr ähnlich ist, bei der aber
wirklich alle Daten korrekt sortiert werden.

Der String sieht dann so aus:
strSQL = "SELECT * FROM webdb ta ORDER BY (SELECT MIN(datum1) FROM webdb tb
WHERE tb.titel = ta.titel GROUP BY tb.titel), ta.titel, ta.datum1"

und so das Ergebnis:
http://www.arbeitszeitberatung.de/04...gen/test2.aspx

Ich verstehe ehrlich gesagt nicht wirklich, was da genau den Unterschied
ausmacht, bin aber auf jeden Fall froh, jetzt die perfekte Lösung zu haben.

Also ganz herzlichen Dank noch einmal.
Viele Grüße
Thomas



"Thomas Gehrmann" <webmaster (AT) arbeitszeitberatung (DOT) de> schrieb im Newsbeitrag
news:j8eeqn$9ih$1 (AT) online (DOT) de...
Hi Tony,
mag sein, dass dein deutsch nicht perfekt ist, deine Lösung hingegen kommt
dem schon sehr nahe :-)
Hab ganz herzlichen Dank.

So sieht das Ergebnis dann mit den echten Daten aus, um die es geht:
http://www.arbeitszeitberatung.de/04...ngen/test.aspx

Das ist wirklich nahezu perfekt. Aber es gibt seltsamerweise zwei
Veranstaltungen, die sich nicht an die Sortierung halten, nämlich

Tages-Seminar
Optimierung der Abläufe im OP
07.05.2012, Hannover

und

Tages-Seminar
Vertrauensarbeitszeit - Gestaltungsperspektiven und Umsetzung
14.11.2012, Berlin

Diese beiden Veranstaltungen müssten weiter unten einsortiert werden. Ich
kann mir irgendwie nicht erklären, warum es bei denen nicht klappt, bei
allen anderen aber schon.

Schau mal, so sieht jetzt der echte SQL-String aus. Fällt dir daran
vielleichte etwas auf, woran es liegen könnte:
strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb ON webdb.Titel=t.Titel ORDER BY
Mindatum,Datum1"

Die Tabelle enthält übrigens nur die 38 Datensätze und viel mehr werden
aus auch nicht (maximal vielleicht 50).

Auf jeden Fall schon mal vielen, vielen Dank
Thomas





"Tony Mountifield" <tony (AT) mountifield (DOT) org> schrieb im Newsbeitrag
news:j8ebes$n4o$1 (AT) softins (DOT) clara.co.uk...
In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss
das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß, wie
ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In
der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt
wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die
zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen
Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen
Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011,
die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird darum
als
nächstes aufgeführt, wiederum gefolgt von allen anderen Veranstaltungen
des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis
sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst werden,
wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten Termine
der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org



--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
  #7  
Old   
Thomas Gehrmann
 
Posts: n/a

Default Re: Komplizierte Sortierung - 10-29-2011 , 02:06 AM



Hi Tony,
vielen Dank, dass du dir noch einmal Gedanken gemacht hast. Aber leider
werden auch damit nicht alle Veranstaltungen korret sortiert. Das Ergebnis
ist das gleich wie vorher.
Du hast bestimmt recht damit, dass die andere Variante nicht so sparsam ist.
Aber das nehme ich jetzt einfach in Kauf, weil die Tabelle ohnehin nicht
größer wird als maximal 50 Datensätze.

Also, herzlichen Dank nochmal
und ein schönes Wochenende!
Thomas


----- Original Message -----
From: "Tony Mountifield" <tony (AT) mountifield (DOT) org>
Newsgroups: comp.databases.mysql
Sent: Friday, October 28, 2011 5:43 PM
Subject: Re: Komplizierte Sortierung


Quote:
Hi Thomas,

Ich glaube, dass die zweite Antwort nicht so sparsam ist, weil es eine
SELECT für jede Reihe machen muss (ORDER BY). Wenn die Tabelle gross
wird, läuft es vielleicht langsam.

Vielleicht ist der MySQL-Server verwirrt wegen der zwei "webdb" Tabellen.
Bitte versuche auch diese Query:

strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM webdb
GROUP BY Titel) AS t INNER JOIN webdb w2 ON w2.Titel=t.Titel ORDER BY
Mindatum,w2.Datum1"

Ich habe "w2" eingefügt, um deutlich zu sein.

Wenn dass nicht korrekt läuft, bin ich da überfragt!

MfG,
Tony

In article <j8eg20$aiq$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo noch einmal, Tony,
ich hatte das Problem auch in einer anderen Newsgroup gepostet. Dort habe
ich jetzt eine Antwort bekommen, die deiner sehr ähnlich ist, bei der
aber
wirklich alle Daten korrekt sortiert werden.

Der String sieht dann so aus:
strSQL = "SELECT * FROM webdb ta ORDER BY (SELECT MIN(datum1) FROM webdb
tb
WHERE tb.titel = ta.titel GROUP BY tb.titel), ta.titel, ta.datum1"

und so das Ergebnis:
http://www.arbeitszeitberatung.de/04...gen/test2.aspx

Ich verstehe ehrlich gesagt nicht wirklich, was da genau den Unterschied
ausmacht, bin aber auf jeden Fall froh, jetzt die perfekte Lösung zu
haben.

Also ganz herzlichen Dank noch einmal.
Viele Grüße
Thomas



"Thomas Gehrmann" <webmaster (AT) arbeitszeitberatung (DOT) de> schrieb im
Newsbeitrag
news:j8eeqn$9ih$1 (AT) online (DOT) de...
Hi Tony,
mag sein, dass dein deutsch nicht perfekt ist, deine Lösung hingegen
kommt
dem schon sehr nahe :-)
Hab ganz herzlichen Dank.

So sieht das Ergebnis dann mit den echten Daten aus, um die es geht:
http://www.arbeitszeitberatung.de/04...ngen/test.aspx

Das ist wirklich nahezu perfekt. Aber es gibt seltsamerweise zwei
Veranstaltungen, die sich nicht an die Sortierung halten, nämlich

Tages-Seminar
Optimierung der Abläufe im OP
07.05.2012, Hannover

und

Tages-Seminar
Vertrauensarbeitszeit - Gestaltungsperspektiven und Umsetzung
14.11.2012, Berlin

Diese beiden Veranstaltungen müssten weiter unten einsortiert werden.
Ich
kann mir irgendwie nicht erklären, warum es bei denen nicht klappt, bei
allen anderen aber schon.

Schau mal, so sieht jetzt der echte SQL-String aus. Fällt dir daran
vielleichte etwas auf, woran es liegen könnte:
strSQL = "SELECT * FROM (SELECT MIN(Datum1) AS Mindatum, Titel FROM
webdb
GROUP BY Titel) AS t INNER JOIN webdb ON webdb.Titel=t.Titel ORDER BY
Mindatum,Datum1"

Die Tabelle enthält übrigens nur die 38 Datensätze und viel mehr werden
aus auch nicht (maximal vielleicht 50).

Auf jeden Fall schon mal vielen, vielen Dank
Thomas





"Tony Mountifield" <tony (AT) mountifield (DOT) org> schrieb im Newsbeitrag
news:j8ebes$n4o$1 (AT) softins (DOT) clara.co.uk...
In article <j8e8d5$4j5$1 (AT) online (DOT) de>,
Thomas Gehrmann <webmaster (AT) arbeitszeitberatung (DOT) de> wrote:
Hallo NG,
ich habe folgendes Problem: Ich möchte eine Tabelle Abfragen und muss
das
Ergebnis in einer Weise sortiert ausgeben, für die ich nicht weiß,
wie
ich
den SQL-String aufbauen muss.

Sagen wir der Einfachheit halber, die Tabelle hätte nur 2 Spalten. In
der
ersten steht ein Datum, in der zweiten ein Veranstaltungstyp. Hier
ein
Beispiel

Datum | Typ
08.11.2011 | Veranstaltung A
18.11.2011 | Veranstaltung B
01.11.2011 | Veranstaltung A
10.11.2011 | Veranstaltung C
05.11.2011 | Veranstaltung B

Veranstaltungen können also mehrfach auftauchen.
Die zu erstellende Abfrage soll mir nun alle Datensätze wiedergeben
und
dabei so sortieren, dass die früheste Veranstaltung zuerst angezeigt
wird,
anschließend in zeitlich aufsteigender Folge alle weiteren gleichen
Veranstaltungen. Danach kommt die nächste andere Veranstaltung, die
zeitlich
nach dem ersten Termin liegt und dann wiederum alle gleichen
Veranstaltungen
in aufsteigender Reihenfolge und so weiter. Das ist etwas kompliziert
zu
beschreiben. Darum hier das gewünschte Abfrageergebnis für die obige
Tabelle:

Datum | Typ
01.11.2011 | Veranstaltung A
08.11.2011 | Veranstaltung A
05.11.2011 | Veranstaltung B
18.11.2011 | Veranstaltung B
10.11.2011 | Veranstaltung C

Die früheste Veranstaltung ist die Veranstaltung A am 01.11.2011;
anschließend werden in aufsteigender Reihefolge alle anderen
Veranstaltungen
des Typs A aufgeführt. Die nächste Veranstaltung nach dem 01.11.2011,
die
nicht Typ A ist, ist die Veranstaltung B am 05.11.2011. Sie wird
darum
als
nächstes aufgeführt, wiederum gefolgt von allen anderen
Veranstaltungen
des
gleichen Typs in zeitlich aufsteigender Reihenfolge etc. Im Ergebnis
sollen
die Veranstaltungen also nach Typen in Blöcken zusammengefasst
werden,
wobei
die Reihefolge der Blöcke von der Chronologie der jeweils ersten
Termine
der
Blöcke abhängt.

Vielleicht fällt einem von euch eine ganz einfache Lösung für so eine
Sortierung ein?

Thomas,

Leider is mein Deutsch nicht gut genug zu erzählen. Versuche diese:

SELECT Datum,Tabelle.Typ
FROM (SELECT MIN(Datum) AS Mindatum, Typ
FROM Tabelle
GROUP BY Typ) AS t
INNER JOIN Tabelle ON Tabelle.Typ=t.Typ
ORDER BY Mindatum,Datum;

Wenn die Tabelle gross ist, brauchst Du eine Index auf Typ.

MfG,
Tony
--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org




--
Tony Mountifield
Work: tony (AT) softins (DOT) co.uk - http://www.softins.co.uk
Play: tony (AT) mountifield (DOT) org - http://tony.mountifield.org

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.