![]() |
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:
Ich benoetige nun ein Query, welches mir die aktuellsten Daten aller Mitarbeiter ausliest. Theoretisch wuerde dies so aussehen:
SQL-Code:
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.
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 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 |
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 |
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 |
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 |
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 |
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:
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.
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz