WinFuture-Forum.de: [gelöst und reputiert] mySQL Abfrage mit Sortierung und limitiertem Pa - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[gelöst und reputiert] mySQL Abfrage mit Sortierung und limitiertem Pa (Super Frage mit prima Beispiel)


#1 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 08. August 2011 - 16:47

Ja also ich bin gerade betriebsblind. Ich möchte eine sortierte Abfrage machen, wobei der eine Parameter aber limitiert ist. ich mach da mal ein Beipsiel:

Ich hab eine Tabelle

|Person|Aktion|Zeit|

und beispielsweise 5 Personen machen zu unterschiedlichen Zeiten 20 Aktionen. Nun will ich die letzten 3 Aktionen von unterschiedlichen Personen abfragen. Also im Prinzip einfach eine Abfrage der Aktionen, - ORDER BY `Zeit` DESC LIMIT 3 - aber mit der Bedingung, dass nicht mehrere Aktionen von der gleichen Person dabei sind.

Dieser Beitrag wurde von Holger_N bearbeitet: 09. August 2011 - 09:09

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 08. August 2011 - 17:56

Stichwort, GROUP BY. In etwa so:
select Person, Aktion, Zeit
from personen
group by Person,Aktion
order by Person, Zeit desc

0

#3 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 08. August 2011 - 18:51

So ganz klappts noch nicht. Also die Aktion an sich spielt ja für Gruppierung und Sortierung keine wirkliche Rolle

ich habs mal probiert mit

group by Person order by Zeit desc

Dann sortiert er zwar nach Zeit richtig, also 3 Aktionen ohne doppelte Person und bezogen auf die 3 ausgewählten Aktionen auch die jüngste Aktion zuerst aber bezogen auf die Personen sind es die ältesten Aktionen der Person. Ich hab auch nur die beiden Werte für Person und Zeit zum gruppieren und Sortieren. Alle anderen Werte sind beliebig austauschbar und frei wählbar und hätten da keinen sinnvollen Einfluss.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#4 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 652
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 08. August 2011 - 22:18

SELECT t1.* FROM personen t1 LEFT OUTER JOIN personen t2 ON (t1.person = t2.person AND t1.zeit < t2.zeit) GROUP BY t1.zeit HAVING count(*) < 3 ORDER BY t1.person, t1.zeit DESC;


Frag mich nicht, warum es funktioniert, aber das tut es scheinbar :huh:

Google-Suche zum Glück: mysql top n per group
Raise your glass if you are wrong
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 08. August 2011 - 22:44

Klappt nich, ich glaub ich mach einfach 3 Abfragen.

Abfrage 1 alle Aktionen nach Zeit sortiert, jüngste zuerst LIMIT 1

Abfrage 2 alle Aktionen nach Zeit sortiert, jüngste zuerst, ohne die Person, der Abfrage 1 zuzuordnen ist LIMIT 1

Abfrage 3 alle Aktionen nach Zeit sortiert, jüngste zuerst, ohne die Personen, denen Abfrage 1 und 2 zuzuordnen sind LIMIT 2
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#6 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 09. August 2011 - 07:02

Ach, das kriegen wir schon mit einem Statement hin. :)

Hättest du mal ein paar Testdaten für uns? Am besten wie sie in der Datenbank stehen und wie du die Ausgabe gerne hättest.
0

#7 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 09. August 2011 - 07:23

Ich tipp mal ein vereinfachtes Beispiel
id | nr | wert | zeit
1  | 1  |  a   | 1
2  | 2  |  b   | 2
3  | 1  |  c   | 3
4  | 3  |  d   | 4
5  | 1  |  e   | 5
6  | 3  |  f   | 6
7  | 1  |  g   | 7


In der Spalte Zeit stände dann der Zeitstempel von Herrn Unix
Ausgabe soll sein zeitlich rückwärts sortiert, ohne doppelte Nummer also:
nr 1 | wert g | zeit 7
nr 3 | wert f | zeit 6
nr 2 | wert b | zeit 2


Mit der einfachen Gruppierung von "nr" hab ich zwar keine Nummer doppelt aber nicht die jüngsten Einträge. Wenn ich - SELECT MAX(zeit) as zeit - angebe, dann stimmen die Spalten "nr" und "zeit" in der Ausgabe aber die Spalte wert nicht.

Dieser Beitrag wurde von Holger_N bearbeitet: 09. August 2011 - 07:26

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 09. August 2011 - 08:22

So..falls ich dich richtig verstanden habe, kannst du das wie folgt lösen:
SELECT p1.nr, p1.wert, p1.zeit
FROM personen p1
WHERE (select COUNT(*) from personen p2 WHERE p1.nr = p2.nr AND p2.zeit > p1.zeit) < 1
ORDER BY p1.zeit DESC

Wobei die "1" am Ende der where-Klausel die letzten n Aktionen einer Person bestimmt.
1

#9 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 652
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 09. August 2011 - 08:27

Beitrag anzeigenZitat (Holger_N: 08. August 2011 - 22:44)

Klappt nich


großartig, sehr hilfreich <_<

Was klappt nicht?
Raise your glass if you are wrong
0

#10 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 09. August 2011 - 08:58

Beitrag anzeigenZitat (Witi: 09. August 2011 - 08:22)

So..falls ich dich richtig verstanden habe, kannst du das wie folgt lösen:
SELECT p1.nr, p1.wert, p1.zeit
FROM personen p1
WHERE (select COUNT(*) from personen p2 WHERE p1.nr = p2.nr AND p2.zeit > p1.zeit) < 1
ORDER BY p1.zeit DESC

Wobei die "1" am Ende der where-Klausel die letzten n Aktionen einer Person bestimmt.


Tatsache - klappt. am Anfang hab ich p1.* draus gemacht (sind ein paar mehr "werte" und ein where mußte auch noch rein, weil ich da noch eine Bedingung vergessen hatte) aber funktioniert erstmal wie es soll. Schon komisch, dass es für sowas keinen einfachen Sortierbefehl gibt. Müßte doch fast in jeder dritten Datenbank vorkommen so eine Sortierung.

So - feierliche Reputation

Dieser Beitrag wurde von Holger_N bearbeitet: 09. August 2011 - 09:00

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#11 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 09. August 2011 - 09:08

Beitrag anzeigenZitat (zwutz: 09. August 2011 - 08:27)

großartig, sehr hilfreich <_<

Was klappt nicht?


Ich hatte es mehrfach versucht den Fehler zu formulieren, also den Unterschied zwischen erwünschter und tatsächlicher Ausgabe aber bin gestern Nacht an meiner eigenen Verwirrung gescheitert. Heute morgen mit der Beispieltabelle hab ich das dann endlich nachvollziehbar hinbekommen. Meine Originaldatenbanktabelle dazu ist ja noch viel verwirrender und ich mußte dann ja immer von meiner Tabelle mein Muster hier umdenken aber nun hats ja geklappt.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0