MSSQL: Join über mehrere Tabellen?

tsurt

Grünschnabel
Hallo liebe Community,

ich war früher schon mal in der Community aktiv, kann aber leider meinen Benutzernamen nicht wiederfinden, und die damals verwendete Emailaddy ist nicht mehr vorhanden, somit musste ich mich neu registrieren.

Ich habe folgendes Problem.

Ich hab 3 Tabelle:

1 Tabelle Projekte in der Datenbank X
2 Tabelle Details, Mitarbeiter in der Datenbank Y

Die Tabelle sind folgender Maßen aufgebaut:

Tabelle Projekte: Felder ProjektID, sonstige Felder(nicht relevant)

Tabelle Details: Felder ProjektID, Mitarbeiter ID, Zeit, Datum

Tabelle Mitarbeiter: Felder MitarbeiterID, Name


Ich benutze dass Jquery Plugin Datatables und will in dieser Tabelle Daten ausgeben, was auch grundsätzlich funktioniert. Grundsätzlich is nicht zu jedem Datensatz aus Projkete ein Daten Satz
Mein Problem: Ich will zu jedem Projekt, den Mitarbeiter ausgeben, der zuletzt an dem Projekt gearbeitet hat, also geordnet nach der Zeit:

Code:
		SELECT Projekte.ProjektID,  Details.MitarbeiterID
		FROM  Projekte		
		INNER JOIN
			Details
		ON
			Projekte.ProjektID = Details.ProjektID


Ich habe den Query vereinfacht dargestellt und den Rest weggelassen. Einen einfachen Join zu machen ist ja nicht das Problem, aber irgendwie hab ich gerade keinen Ansatz, wie ich nun aus der Ausgabe, die mir mit diesem Query alle Detaildatensätze zu dieser ProjektID ausgibt, meine Wunschausgabe bekomme.

Wie mache ich daraus einen Query, der mir nur den neuesten Datensatz aus Details gibt, und diesen dann auch noch mit der Mitarbeiter Tabelle verknüpft, sodass ich den richtigen Namen bekomme?


Hoffe ihr könnt mir helfen..stehe echt aufm Schlauch


Grüße

Paul
 
Zuletzt bearbeitet:
Hallo nochmal,

vieleichthab ich mich nicht richtig ausgedrückt


hier noch mal der Query ,den ich im Moment habe


PHP:
$aColumns = array( 'Status', 'ProjectNumber', 'MatchcodeAdd', 'MitarbeiterID', 'Matchcode');



	$sQuery_anzeige = "
		SELECT ".str_replace(" , ", " ", implode(", ", $aColumns))."
		FROM   $sTable
		INNER JOIN
			tdCustomers
		ON
			tdProjects.CustomerID = tdCustomers.CustomerID	
			
		LEFT OUTER JOIN
			[auftragsinformationstool].[dbo].[Details]
		ON
			tdProjects.ProjectNumber = [auftragsinformationstool].[dbo].[Details].[ProjektID]			
			
		LEFT OUTER JOIN
			[auftragsinformationstool].[dbo].[Auftrag]
		ON
			tdProjects.ProjectNumber = [auftragsinformationstool].[dbo].[Auftrag].[ProjektID]
		$sWhere
		$sOrder";


$order und $where werden dynamisch erzeugt und tun hier nichts zu Sache. Im Moment gibt er mir zu jedem Projekt X-Spalten aus. Also wenn zwei Details vorhanden sind, 2 Datensätze! USW.

Ich will aber nur den neusten Datensatz haben anstatt alle, und mit dem neusten Datensatz per MitarbeiterID den Namen aus der Tabelle Mitarbeiter lesen.


Weiß keiner Hilfe? Wenn ich mein Problem nicht gut genug beschrieben habe, dann schreibt es :) Kann ja net sein, dass es keinen gibt, der für sowas ne Lösung hat^^
 
Zuletzt bearbeitet:
Das ist bei MSSQL in der tat etwas komplizierter, da man ohne subquerys keine rows selectet bekommt die nicht teil des group statements oder einer aggregatsfunktion sind.

Man müsste also ein subquery so verwenden:
SQL:
SELECT p.*,d.*,m.* FROM projects p
INNER JOIN details d
ON p.projectID = d.projectID
INNER JOIN mitarbeiter m
ON m.mitarbeiterID = d.mitarbeiterID
INNER JOIN (
    SELECT projectID, max(created_at) as created_at
    FROM projects p
    INNER JOIN details d
    ON  p.projectID = d.projectID
    GROUP BY projectID
) tmp
ON tmp.projectID = d.projectID AND tmp.created_at = d.created_at

ist an der stelle aber ziemlich hässlich das datum zu verwenden. sinnvoller wäre es IMHO der tabelle eine identity zu geben, und mit max(identity) anstatt max(created_at) zu arbeiten.
 
Danke dir schon mal, werdes es am Montag ausprobieren. Ich hatte es auchs chon mal mit Subqueries im Join probiert, aber immer nen Syntaxfehler bekommen. Ist doch teilweise ein bisschen komplizierter, als MYSQL und ich muss mich daran erst gewöhnen.

Ich hab daran auch schon gedacht, aber man kann die Datensätze ändern, und wenn dann einer das Datum zurückdatiert, weil er vlt vergessen hatte einzutragen, wäre ja der mit der höchsten ID nicht mehr der neuste.
 

Neue Beiträge

Zurück