Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   GROUP BY nach ORDER BY? (https://www.delphipraxis.net/129576-group-nach-order.html)

alcaeus 21. Feb 2009 16:08

Datenbank: MySQL • Version: 4.1 • Zugriff über: PHP-Funktionen

GROUP BY nach ORDER BY?
 
Hallo ihr,

fuer eine Abrechnungssoftware muss ich ein Query schreiben, welches die aktuellsten Daten aller Mitarbeiter ausliest. Da es sich um eine Abrechnungssoftware handelt, muss natuerlich die Historie aller Mitarbeiter speichern. Ich habe deshalb zwei Tabellen:
  • employees_employees, welche "normale" Daten, wie z.B. Name, Geburtsdatum, usw. speichert, also alle Informationen, welche man nur einmal eingibt
  • employees_employee_data, welche alle aenderbaren Daten (Bankverbindung, Lohnsteuerklasse, usw.) speichert. Diese Tabelle enthaelt auch ein Feld, welches das Startdatum der Gueltigkeit dieser Daten bestimmt.

Ich benoetige nun ein Query, welches mir die aktuellsten Daten aller Mitarbeiter ausliest. Theoretisch wuerde dies so aussehen:
SQL-Code:
select ee.nickname, eed.* FROM employees_employees ee, employees_employee_data eed WHERE ee.id = eed.emp_id
ORDER BY ee.nickname ASC, eed.start_date DESC
GROUP BY ee.id
Wichtig ist die absteigende Sortierung nach dem Startdatum, da natuerlich der Datensatz mit dem neuesten Datum die aktuellsten Daten enthaelt. Das Problem bei der Sache: GROUP muss vor ORDER kommen, weshalb obige Abfrage auch nicht funktioniert.

Weiss jemand wie ich diese Abfrage so schreiben kann, dass ich die benoetigten Daten mit einem Query rauskriege? Ich koennte den GROUP ja auch weglassen, aber ich wuerde ungern alle Datensaetze auslesen (man stelle sich vor wieviel da zusammenkommt, wenn 200 Mitarbeiter 10 Jahre lang beschaeftigt waren ;) ) und erst bei der Ausgabe die irrelevanten Daten ueberspringen.

Greetz
alcaeus

DeddyH 21. Feb 2009 16:16

Re: GROUP BY nach ORDER BY?
 
Ungetestet:
SQL-Code:
SELECT ee.nickname, eed.*
FROM employees_employees ee
JOIN employees_employee_data eed ON ee.id = eed.emp_id
WHERE eed.start_date =
  (SELECT MAX(employees_employee_data.start_date)
   FROM employees_employee_data
   WHERE employees_employee_data.emp_id = ee.id)
ORDER BY ee.nickname

alcaeus 21. Feb 2009 16:21

Re: GROUP BY nach ORDER BY?
 
Ja, das wars. Ich bin gerade vorhin noch auf die Idee mit Subqueries gekommen und wollte grad nochmal ein Query testen. Ich muss mich erst dran gewoehnen, dass MySQL 4.1 ja auch Subqueries kann :)

Danke fuer die Hilfe!

Greetz
alcaeus

Dax 21. Feb 2009 16:30

Re: GROUP BY nach ORDER BY?
 
Ich würde vermuten, dass es auch ohne Subqueries im Where geht:
SQL-Code:
SELECT ee.nickname, eed.*
FROM employees_employees ee
     JOIN employees_employee_data eed ON (ee.id = eed.emp_id)
     JOIN (SELECT eed2.emp_id AS emp_id, MAX(eed2.start_date) as start_date
           FROM employees_employee_data eed2
           GROUP BY emp_id, start_date) limits ON (ee.id = limits.emp_id AND eed.start_date = limits.start_date)
ORDER BY ee.nickname, eed.start_date

alcaeus 21. Feb 2009 16:36

Re: GROUP BY nach ORDER BY?
 
Danke fuer den Tipp, aber das Subquery im WHERE stoert mich nicht - im Gegenteil, es ist sogar schoen erklaerend :)

Greetz
alcaeus

alzaimar 22. Feb 2009 09:41

Re: GROUP BY nach ORDER BY?
 
Tipp: Führe in der Tabelle 'employees_employee_data' eine Spalte 'Current = bool' ein. Steht dort ein 'True', handelt es sich um den aktuellen Satz, sonst nicht. Über einen Trigger könntest du sicherstellen, das *nur* der aktuelle Datensatz eines Mitarbeiters hier ein TRUE zu stehen hat.

Dann wäre die von Dir gesuchte Query ganz einfach:
SQL-Code:
SELECT ee.nickname, eed.*
FROM employees_employees ee
     JOIN employees_employee_data eed ON (ee.id = eed.emp_id)
where eed.Current = 'TRUE'    
ORDER BY ee.nickname
Deine Architektur und die damit verbundene Query hat den Nachteil, das Du dir für eine Allerweltsabfrage schon einen abbrechen und den Server unnötig belasten musst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz