MYSQL - Wie Abfrage schreiben

warly

Grünschnabel
Hallo erstmal,

ich bin ganz neu hier und hoffe ich finde hier Hilfe ;-)

Ich weiß nicht genau wie ich eine Abfrage erstellen soll, ich habe schon lange gegoogelt aber leider nichts richtiges gefunden und komme einfach nicht weiter.

Ich habe eine Tabelle:

Mitarbeiter
PHP:
userID | Name
------------
1 | Name1
2 | Name2

und eine Tabelle

Tätigkeiten
PHP:
userID | tätigkeitID
------------
1 | 4
1 | 6
1 | 7 
2 | 4
2 | 5

Was ich nun möchte, ist per Abfrage alle Mitarbeiter rausbekommen, die Tätigkeit 4,6 und 7 ausführen, also alle die all diese ausführen und nicht nur eine davon.

Ich hoffe ich habe mich verständlich ausgedrückt und hoffe mir kann jemand auf die Sprünge helfen ?

...oder gibt es eine bessere Möglichkeit diese Daten zu speichern und abzufragen ?
 
Hi und willkommen

Ich gehe mal davon aus, dass du eine MySQL-Version nutzt, die Sub-Querys unterstützt.
Probier folgendes:
SQL:
SELECT * FROM Users WHERE userid IN 
(SELECT userid FROM Operations WHERE operationid IN(4,6,7))
 
Hi,

danke für die Antwort, aber leider klappt das nicht, so zeigt er mir auch User 1 und 2 an, da bei beiden ja die 4 vorkommt :-(

PS: Ich nutze mysql 5.0.45 hatte ich vergessen.
 
Hi,

ganz genau, ob es nun 3 Tätigkeiten sind oder 5 etc. ;-)

...oder gibt es eine bessere Möglichkeit die Daten zu speichern und abzufragen ?
 
ich bin leider kein Experte und wüsste nur einen umständlichen weg:

Code:
SELECT UserID FROM Tätigkeit WHERE TätigkeitID = 4
(liefer alle zurück die die Tätigkeit 4 ausführen!)

in diesem Ergebniss kannst du dann nach denen suchen die Tätigkeit 6 ausführen:
Code:
SELECT USERID FROM Tätigkeit where userID IN (SELECT UserID FROM Tätigkeit WHERE TätigkeitID = 4 ) AND TätigkeitID = 6

und in diesem Ergebniss wiederum kannst du suchen wer zusätzlich noch die Tätigkeit 7 ausführt::
Code:
SELECT USERID FROM Tätigkeit where userID IN (SELECT USERID FROM Tätigkeit where userID IN (SELECT UserID FROM Tätigkeit WHERE TätigkeitID = 4 ) AND TätigkeitID = 6)AND TätigkeitID = 7

und hast du alle UserID und kannst diese aus der Usertabelle raussuchen:
Code:
SELECT * FROM User where UserID IN(SELECT USERID FROM Tätigkeit where userID IN (SELECT USERID FROM Tätigkeit where userID IN (SELECT UserID FROM Tätigkeit WHERE TätigkeitID = 4 ) AND TätigkeitID = 6)AND TätigkeitID = 7)

Ich gehe mal davona us das das Statement nicht funktioniert aufgrund von Tipp oder Rechtschreibfehlern, außerdem gibt es sicherlich eine schönere Möglichkeit das Problem zulösen aber ich denke so hast du zumindest schonmal einen Ansatz wie es funktionieren könnte.
 
Hi,

Danke, allerdings ist das glaube nicht so sauber, über etliche Abfragen an das Ergebnis zu kommen und Performance mäßig sicherlich auch nicht gut.

Wenn ich z.B. nun nach 10 Tätigkeiten suchen würde... ;-)

Ich denke es gibt da bestimmt eine saubere / kürzere Lösung, ich weiß allerdings auch nicht wonach ich genau googlen soll ;-)

Mir wurde gesagt, das es am besten ist die Daten in der Form abzuspeichern wie ich es im ersten Post geschrieben habe, allerdings ist hier die Abfrage mein Problem..
 
Die Art wie du deine tabellen angelegt hast ist schon richtig so...

Würdest du eine Tabelle anlegen die eine user id hat und genauso viele zusaätzliche Spalten wie Tätigkeiten wäre die abfrage zwar recht simpel (select * from tabelle where user id = x and tätigkeit1 = true and tätigkeit2 = true..usw) allerdings müsstest du diese Tabelle dann jedesmal ändern, wenn es eine neue Tätigkeit gibt.

Also....das Datenbankmodell ist so schon richtig angelegt!
Wie gesagt, bin kein Experte..aber das es eine schönere Möglichkeit gibt...daran zweifel ich nicht! Nur leider kenn ich sie auch nicht :-/
 
Hi,

ja so hatte ich es auch erst überlegt, eine zweite Tabelle mit den Tätigkeiten und diese verknüpft über die userID und dann halt tätigkeit1 = 0 bzw.1 usw..

Dann wären die Ergebnisse mit einer Abfrage schnell und einfach zu bekommen.
Aber das soll ja nicht so schön / gut sein !?

Der Nachteil wie Du schon sagst, man müsste neue Felder anlegen wenn Tätigkeiten etc. dazu kommen.

Hmmm, hast Du vielleicht einen Tipp wonach ich googeln könnte um Antworten zu finden ?

Ich denke das ist ja eigentlich nichts unmögliches, gibt ja viele Seiten wie z.B. Flirtseiten oder so, da wird das doch wahrscheinlich auch so gemacht ?
 
Mir fällt momentan auch kein passendes Suchwort ein, aber hier sind genügent Leute mit besserem Wissen als wir beide es Besitzen... warte einfach ein wenig.
 

Neue Beiträge

Zurück