SQL-Frage, Sortierproblem

SQL-Frage, Sortierproblem

am 28.12.2006 08:54:13 von Thomas Huth

Hallo Leute,

ich grübele seit langer Zeit schon über einem Problem:
Ich habe eine Liste von Werten, die mit 1 beginnend fortlaufend
nummeriert (Sortierkriterium) sind. Diese Werte möchte ich in einer
HTML-Tabelle Spaltenweise(!) zum Bsp. über 2 Spalten (oder 3 oder 4)
ausgeben. Dass ich HTML-Tabellen nur zeilenweise schreiben kann ist
schon klar, darum möchte ich die Werte gern entsprechend vorsortieren
und zwar am liebsten schon in der Datenbank per SQL.

Hat sich darüber auch schonmal jemand den Kopf zerbrochen?

Bisher habe ich das Problem so gelöst, dass ich den Datensätzen ein
zusätzliches Feld spendiert habe, über das ich diese Sortierung zu
fuss regele. Auf die Programmierung in php wollte ich an dieser Stelle
verzichten. Hmm, damit ist das Thema hier eigentlich OT, aber der ganze
Rest ist php ;-)

Danke für alle Tips

Gruß von
Thomas

Re: SQL-Frage, Sortierproblem

am 28.12.2006 10:27:27 von Heiko Richler

Hallo Thomas,

> Bisher habe ich das Problem so gelöst, dass ich den Datensätzen ein
> zusätzliches Feld spendiert habe, über das ich diese Sortierung zu
> fuss regele.

Da die Nummern fortlaufend sind kannst Du die Positionen ausrechnen:

Seien n die Anzahl der Zellen pro Spalte und Nr deine fortlaufende
Nummerierung:

select ... order by (Nr-1) div n, mod(Nr-1, n)

Aufpassen musst Du jedoch, dass es zu Lücken kommen kann:

mod:0 mod:1 mod:2
(Nr-1) div 6 == 0 1 | 7 | 13
(Nr-1) div 6 == 1 2 | 8 | 14
(Nr-1) div 6 == 2 3 | 9 | 15
(Nr-1) div 6 == 3 4 | 10 | 16
(Nr-1) div 6 == 4 5 | 11 |
(Nr-1) div 6 == 5 6 | 12 |

nach 11 (div:4,mod:1) kommt 6 (div:5,mod:2)

Möchtest Du nun statt der Anzahl der Zeilen die Anzahl der Spalten
vorgeben? Dann benötigst Du die Anzahl der anzuzeigenden Datensätze.
Entweder es sind x Datensätze pro Seite (ab Seite 0):

where Nr between x*Seite+1 and x*(Seite+1)
order by (Nr-1-x*Seite) div n, mod(Nr-1-x*Seite, n)

Oder Du holst Dir die Anzahl der Datensätze teilst sie Durch die Anzahl
der Spalten und rundest auf.

Die zusätzliche Spalte in der Datenbank kann trotzdem sinnvoll sein. Du
könntest diese z.B. immer dann aktualisieren wenn Du die Werte änderst.
Dann musst Du nicht immer nachrechnen.

Heiko
--
http://portal.richler.de/ Namensportal zu Richler
http://www.richler.de/ Heiko Richler: Computer - Know How!
http://www.richler.info/ private Homepage

Re: SQL-Frage, Sortierproblem

am 28.12.2006 10:33:40 von Thomas Huth

...yuhuuu, tja, wozu so ein Thread manchmal gut ist. Dann fängt man
an, nochmal etwas intensiver zu grübeln und so habe ich jetzt eine
Lösung für mich gefunden :-)

Thomas Huth schrieb:
> Hallo Leute,
>
> ich grübele seit langer Zeit schon über einem Problem:
> Ich habe eine Liste von Werten, die mit 1 beginnend fortlaufend
> nummeriert (Sortierkriterium) sind. Diese Werte möchte ich in einer
> HTML-Tabelle Spaltenweise(!) zum Bsp. über 2 Spalten (oder 3 oder 4)
> ausgeben. Dass ich HTML-Tabellen nur zeilenweise schreiben kann ist
> schon klar, darum möchte ich die Werte gern entsprechend vorsortieren
> und zwar am liebsten schon in der Datenbank per SQL.
>

Meine Lösung in meiner Oracle-DB:
select lfdNr, chr(Mod(lfdNr-1, 3)+97) || to_char(lfdNr, '0000000') as
Sort
from tblIrgendwas
where bedingung=3D'sonstwas'
order by 2;

Also irgendwie muss es was mit Mod zu tun haben, dachte ich. Das zweite
Argument ist die Anzahl der gewünschten Spalten. Rein numerische
Lösungen sind mir nur eingefallen, wenn man die Gesamtzahl der Werte
kennt, die ist aber unbekannt, also vielleicht etwas mit Buchstaben
oder so? Die Mod-Fkt liefert 0, 1, 2, ... je nach Anzahl der
gewünschten Spalten, dann addiere ich 97 hinzu und erhalte mit der
chr-Fkt einen kleinen Buchstaben, dann die Zahl noch etwas aufmotzen,
damit das mit der Sortierung hinkommt, das wars.
Wird in anderen DBn wohl auch ähnlich möglich sein

Gruß von
Thomas
Thomas

Re: SQL-Frage, Sortierproblem

am 28.12.2006 11:07:56 von Thomas Huth

Hallo Heiko,

Heiko Richler schrieb:

>
> Da die Nummern fortlaufend sind kannst Du die Positionen ausrechnen:
> ...
>
> Möchtest Du nun statt der Anzahl der Zeilen die Anzahl der Spalten
> vorgeben? Dann benötigst Du die Anzahl der anzuzeigenden Datensätze.
> Entweder es sind x Datensätze pro Seite (ab Seite 0):
>

Es geht sogar noch wesentlich einfacher:
Die Anzahl der Datensätze wollte ich vorher auf jeden Fall nicht
ermitteln. Also einfach mit Mod() die Nummern in die 3 Spalten
aufteilen, danach dann zuerst sortieren und dann nach den
ursprünglichen Zahlen sortieren, das reicht schon:

select lfdNr, Mod(lfdNr-1) as Sort
from tblIrgendwas
order by 2, 1;

Das funktioniert natürlich nur richtig, wenn die Nummern fortlaufend
sind, aber das ist hier gegeben.
Danke fürs mitgrübeln.

Re: SQL-Frage, Sortierproblem

am 28.12.2006 11:24:11 von Thomas Huth

Hallo Heiko,


> Es geht sogar noch wesentlich einfacher:
> ...

...ich glaube, ich halte lieber meine Finger Still und schaue mir Deine
Lösung noch etwas genauer an, ich habe da wohl einen kleinen Knoten im
Hirn gehabt...

Danke & Gruß
Thomas

Re: SQL-Frage, Sortierproblem

am 24.01.2007 16:04:57 von Werner Bauer

Thomas Huth schrieb:
> Hallo Leute,
>=20
> ich grübele seit langer Zeit schon über einem Problem:
> Ich habe eine Liste von Werten, die mit 1 beginnend fortlaufend
> nummeriert (Sortierkriterium) sind. Diese Werte möchte ich in einer
> HTML-Tabelle Spaltenweise(!) zum Bsp. über 2 Spalten (oder 3 oder 4)
> ausgeben.=20

Da kannst du ja die Anzahl mal ausrechnen, und dann 4 Strings füllen,=20
und diese dann (nach dem Durchlauf durch die Datensätze) zB in einer=20
Tabelle in den Spalten 1-4 ausgeben.
Aber an sich ist es nicht nötig.
Mit einem css-float-left Befehl, und dem Einpacken aller Inhalte in=20
ordnet der Browser das Zeugs an, je nach Bildbreite.

Werner