MySQL Joined Queries

membersound

Bekanntes Mitglied
Hallo,

ich komme mit MySQL Abfragung nicht weiter, habe mal ein Beispiel konstruiert:

Ich habe 3 Tabellen, wovon eine nur aus FK's besteht:
Code:
Employee:
----------
EmpID(PK)	Name
101		Jones
103		Smith
105		Britta


Projects:
-----------
ProjID(PK)	Name
COM123		Java
COM456		C++


ASSIGNED:
----------
ProjID(FK)	EmpID(FK)
COM123		101
COM123		103
COM456		103
COM456		105

Bedeutet: Smith hat 2 Projekte zugeteilt bekommen.

Eine Abfrage, welcher Employee einem bestimmten Projekt zugeordnet ist, mache ich so:
SQL:
SELECT DISTINCT employee.*
FROM assigned, employee
WHERE assigned.EmpID = employee.EmpID AND assigned.ProjID = 'COM123';

Weiterhin möchte ich auch eine Query für 2 Projekte, aber so geht es natürlich auch nicht:
SQL:
SELECT DISTINCT employee.*
FROM assigned, employee
WHERE assigned.EmpID = employee.EmpID AND assigned.ProjID = 'COM123' AND assigned.ProjID = 'COM456';

Aber ich finde einfach nichts wie ich es abfragen kann...


Und genauso frag ich mich, wie ich abfragen kann, welcher Employee an allen Projekten arbeitet, ohne den Namen oder ID der vorhandenen Projekte nennen zu müssen.
Danke
 
Zuletzt bearbeitet:
S

SlaterB

Gast
du musst zweimal mit ASSIGNED joinen, den Tabellen Aliase geben,

zur neuen Query: kartesisches Produkt bilden, nach Employe gruppieren, distinct bzw. einfach nur ASSIGNED-Ids bzw. * zählen,
diese Anzahl muss gleich Subquery count(*) auf ASSIGNED sein, Bedingung mit HAVING an das GROUP BY ranhängen
 

membersound

Bekanntes Mitglied
OK, das mit der Gruppe hab ich nun hinbekommen, vielen Dank für die Tipps.

Zu dem Query für 2 Projekte: Geht das nicht irgendwie noch anders als mit joinen der selben Tabelle? Ich mein, was ist wenn ich so 4-18 Projektparameter überprüfen möchte? Dann muss ich ja x mal joinen?
 

membersound

Bekanntes Mitglied
Also mit festgelegten Attributen ist mir jetzt klar wie es funktioniert.

SQL:
SELECT DISTINCT x.EmpID
FROM assigned AS x, assigned AS y, employee
WHERE x.project = 'COM123' AND y.project = 'COM456'
AND x.EmpID = y.EmpID

ABER:
Was ist, wenn ich COMxxx nicht vorgeben will, sondern aus einem Employee auslese? Und dann herausfinden will, welche anderen Employees mindestens auch an diese Projekten mitarbeiten?

Alle Projekte (COM123) von 101 hiermit:
SQL:
SELECT DISTINCT assigned.project
  FROM assigned
  WHERE assigned.EmpID = 101;

Wie kann ich nun ein
SQL:
SELECT DISTINCT *
FROM assigned
WHERE <match all retrieved projects from 101>
ausführen?
 

stone71

Mitglied
Immer im Zuge, dass ich die Frage um diese Uhrzeit noch richtig verstanden habe, dann sollte man alle employee finden, die an den gleichen Projekten arbeiten mit:

SQL:
SELECT DISTINCT *
FROM assigned
WHERE project in (SELECT DISTINCT project FROM assigned WHERE assigned.EmpID = 101)

Hierzu ein Link...
MySQL Subqueries &mdash; DatabaseJournal.com

Ich hoffe, ich habe es verstanden, geholfen und keinen Fehler gemacht... ;-)

Gute Nacht
 

membersound

Bekanntes Mitglied
Fast! So ähnlich hatte ich das auch schonmal. Aber es findet alle Employees, die an irgendeinem Project mitarbeiten, an dem auch 101 arbeitet.
Ich möchte aber nur EmpID finden, die an allen Projecten des gesuchten mitarbeiten.
Dh für 103 sollte die Ausgabe empty sein. Mit deiner Query werden aber alle Emps angezeigt...


Mir kam jetzt eine Idee, wie ich es notfalls über Counts machen kann:
SQL:
SELECT DISTINCT assigned.EmpID, group_concat(assigned.project)
  FROM assigned
  WHERE assigned.project IN (SELECT DISTINCT assigned.project FROM assigned WHERE assigned.EmpID = 103) AND NOT assigned.EmpID = 103
  GROUP BY assigned.EmpID
   HAVING Count(*) >= ( SELECT Count(*) FROM assigned WHERE assigned.EmpID = 103);
Ich gruppiere also alle EmpID, die an irgendeinem Projekt von 103 mitarbeiten, schließe 103 selbst natürlich aus. Dann werf ich mit Count diejenigen raus, die in diesem Select weniger Projekte als 103 haben. Denn in diesem Fall arbeiten sie ja nicht an allen Projekten von 103 mit.

Aber das ist doch noch ganz schön ugly, auch wenn es funktioniert.
Geht das nicht irgendwie besser / einfacher?

Danke
 
Zuletzt bearbeitet:
S

SlaterB

Gast
zählen und vergleichen hilft wieder,
zähle die Projekte von 101 (zwei) (*),
zähle die Projekte pro Mitarbeiter gruppiert, eingeschränkt auf die Projekte von 101,
und die Anzahl muss dann (*) sein (HAVING)

> Zu dem Query für 2 Projekte: Geht das nicht irgendwie noch anders als mit joinen der selben Tabelle? Ich mein, was ist wenn ich so 4-18 Projektparameter überprüfen möchte? Dann muss ich ja x mal joinen?

das geht dann genauso, nur (*) ersetzen durch feste Anzahl Projekte, IN + Menge gibts ja
 
S

SlaterB

Gast
sieht ja gut aus,
auf >= verzichte lieber, durch die Einschränkung sollten es nie mehr sein können, ansonsten liegt ein Problem vor..

ein anderer Weg wäre müsste Mengenprüfung sein, ist X in Menge Y drin oder nicht drin,
das ist glaube ich eine klassische Alternative zum Zählen
 
S

SlaterB

Gast
dass diese Frage nicht kommt hatte ich gehofft..

ich vermute denkbar wäre etwas in der Richtung von:
für employee X:
- selektiere alle Projekte, die in der Menge der Projekte von employee 103 drin sind und nicht in der Menge zu X
- selektiere alle Projekte, die nicht in der Menge der Projekte von employee 103 drin sind und in der Menge zu X
wenn eine dieser Listen nicht leer ist, dann ist X zwar 'schlecht', dennoch mit distinct oder Gruppierung X in dieser Query wählen, wie auch immer sie insgesamt aussieht, können mehrere Schichten sein

daraus wird irgendwie eine Liste von schlechten employees,
das Komplement davon (alle employees, die nicht nicht dieser Liste sind) ist dann das positive Ergebnis

so in der Tat ganz grob, ist jetzt noch bisschen simpler als ich dachte, daher vielleicht nicht korrekt
 

Ähnliche Java Themen

Neue Themen


Oben