Entwickler-Ecke

Datenbanken - SQL Count mit Group-By und Sortierung


Boldar - Di 05.08.14 11:45
Titel: SQL Count mit Group-By und Sortierung
Hi,
ich habe eine kurze Frage:
ich benutze mysql mit ungefähr folgender Spalten-Struktur:

Quelltext
1:
2:
 A || B || C || Timestamp
...

und mache dann folgende abfrage:

Quelltext
1:
SELECT COUNT(*) AS `Datensätze`, `A`, Timestamp FROM `table` GROUP BY `A` ORDER BY `Timestamp`                    


Durch das GROUP BY werden ja die Ergebniszeilen zusammengefasst. Wie kann ich jetzt aber nach dem jeweils aktuellstem Timestamp pro Gruppe sortieren? Oder sagen wir nach dem ältestem?

Edit: Und dazu noch eine weitere Frage:
Ich brauche ein Select, welches eine (gegebene) Anzahl an fortlaufenden Ints zurückgibt, ohne dass Daten zugrundeliegen. Ich könnte natürlich eine beliebige Tabelle nehmen und die zeilennummern verwenden, hätte das aber gerne ohne tabelle. Ich weiss dass ich so etwas benutzen könnte:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        SELECT
            counter
        FROM
            (
                SELECT
                    @counter := @counter +1 AS counter
                FROM
                    (SELECT @counter :=0) AS vars,
                    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d1,
                    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d2,
                    (SELECT 1 UNION SELECT 2 UNION SELECT 3) AS d3,
                    (SELECT 1 UNION SELECT 2 UNION SELECT 3) AS d4,
                    (SELECT 1 UNION SELECT 2 UNION SELECT 3) AS d5
            ) AS t LIMIT 0, 100

Ich kann da zwar das mittels dem Limit flexibel halten, muss aber trotzdem vorher die maximalzahl wissen und halte das auch nicht für sonderlich elegant. geht das nicht irgendwie besser?

Ich hoffe ihr könnt meinen Verwirrungen folgen :o
lg Boldar


Nersgatt - Di 05.08.14 14:22

Das sollte mit MIN() bzw. MAX() machbar sein:


SQL-Anweisung
1:
SELECT COUNT(*) AS `Datensätze`, `A`, MIN(TimestampAS min_timestamp, MAX(Timestampas max_timestamp FROM `tableGROUP BY `A`                    


Für das 2. Problem könnstet Du z.B. eine Stored procedure erstellen die als Schleife die Ints zurück gibt.


Palladin007 - Di 05.08.14 15:00

Ich frage mich gerade beim Zweiten, wofür das gut sein soll.

Kann es sein, dass du da den Datenbank-Server mehr machen lässt, als er eigentlich sollte?
Aus Erfahrung kann ich dir nur raten, so wenig wie möglich vom Server machen zu lassen, außer es bietet tatsächlich ausreichend Vorteile, wie z.B. einen deutlich spürbaren Performance-Vorteil.

Was SQL angeht, erstelle ich nur das Datenbank-Schema, alle Abfragen erstellt das Entity Framework.
Ich weiß nicht, ob es das auch für Delphi und MySQL gibt, aber ich würde glatt meinen Hintern darauf verwetten, dass es irgendeinen anderen guten OR-Mapper gibt. :D


Nersgatt - Di 05.08.14 15:03

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß nicht, ob es das auch für Delphi und MySQL gibt, aber ich würde glatt meinen Hintern darauf verwetten, dass es irgendeinen anderen guten OR-Mapper gibt. :D


Es gibt Persistenzframeworks (z.B. TMS Aurelius, oder was von Devart). Aber wirklich verbreitet ist die Benutzung wohl nicht. Ich stand vor kurzem selbst vor der Entscheidung bei einem neuen Projekt ein solches Persistenzframework einzusetzen. Da ich allerdings niemanden gefunden habe, der konkret im Echtbetrieb mit einem dieser Frameworks Erfahrungen hat (also nicht nach dem Motto "ja, hab ich schon mal mit rumgespielt), hab ich mich nicht getraut.


Boldar - Di 05.08.14 17:52

Vielen Dank, Nersgatt, ich habs jetzt beides hinbekommen.
Mir ist klar, dass das nicht so ideal ist. Es ging mir aber ausdrücklich um einen schnellen Würgaround. Zudem hat mein Problem (momentan noch) nichts mit Delphi zu tun. Hätte das dann in Offtopic gemusst? Dachte Datenbanken passt trotzdem.
lg und Danke,
Boldar