tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Biber2
  • 1 Beitrag von Johannes7146
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
255
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    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-Code:
    userID Name
    ------------
    Name1
    Name2 
    und eine Tabelle

    Tätigkeiten
    PHP-Code:
    userID tätigkeitID
    ------------
    4
    6

    4

    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 ?
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi und willkommen

    Ich gehe mal davon aus, dass du eine MySQL-Version nutzt, die Sub-Querys unterstützt.
    Probier folgendes:
    Code sql:
    1
    2
    
    SELECT * FROM Users WHERE userid IN 
    (SELECT userid FROM Operations WHERE operationid IN(4,6,7))
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    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.
     

  4. #4
    Avatar von Johannes7146
    Johannes7146 Johannes7146 ist offline Goldschnabel
    Registriert seit
    Sep 2007
    Ort
    Gütersloh
    Beiträge
    736
    ich glaube er möchte nur die User die alle 3 tätigkeiten ausführen!
    Geändert von Johannes7146 (25.11.08 um 11:02 Uhr)
     
    Wenn mein Beitrag dir geholfen hat, würde ich mich sehr über eine positive Bewertung oder ein Danke freuen
    Gruß Johannes
    ::: Homepage :::

  5. #5
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    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 ?
     

  6. #6
    Avatar von Johannes7146
    Johannes7146 Johannes7146 ist offline Goldschnabel
    Registriert seit
    Sep 2007
    Ort
    Gütersloh
    Beiträge
    736
    ich bin leider kein Experte und wüsste nur einen umständlichen weg:

    Code :
    1
    
    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 :
    1
    
    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 :
    1
    
    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 :
    1
    
    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.
     
    Wenn mein Beitrag dir geholfen hat, würde ich mich sehr über eine positive Bewertung oder ein Danke freuen
    Gruß Johannes
    ::: Homepage :::

  7. #7
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    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..
     

  8. #8
    Avatar von Johannes7146
    Johannes7146 Johannes7146 ist offline Goldschnabel
    Registriert seit
    Sep 2007
    Ort
    Gütersloh
    Beiträge
    736
    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 :-/
     
    Wenn mein Beitrag dir geholfen hat, würde ich mich sehr über eine positive Bewertung oder ein Danke freuen
    Gruß Johannes
    ::: Homepage :::

  9. #9
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    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 ?
     

  10. #10
    Avatar von Johannes7146
    Johannes7146 Johannes7146 ist offline Goldschnabel
    Registriert seit
    Sep 2007
    Ort
    Gütersloh
    Beiträge
    736
    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.
     
    Wenn mein Beitrag dir geholfen hat, würde ich mich sehr über eine positive Bewertung oder ein Danke freuen
    Gruß Johannes
    ::: Homepage :::

  11. #11
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    Hmm keiner eine Idee oder nen Tipp wonach ich googlen könnte ?
     

  12. #12
    Biber2 Biber2 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Ort
    Bremen
    Beiträge
    215
    Moin warly,

    vielleicht verstehe ich ja das Problem nicht richtig, aber....

    Wenn Du eine Liste von Tätigkeiten hast, nämlich dieses "WHERE TätigkeitID IN ( 4, 5, 6)"
    dann kannst Du einfach ein
    Code :
    1
    2
    3
    4
    
     SELECT userID From Tätigkeiten
    WHERE TätigkeitID IN ( 4, 5, 6)
    GROUP by userID
    having Count (TätigkeitID) = 3;

    Und wenn du meinetwegen noch die Usernamen aus einer Usertabelle dazuflanschen willst, dann:
    Code :
    1
    2
    3
    4
    5
    6
    
    [SELECT u.userID, u.userName From Usertabelle u,
    (SELECT Userid From Tätigkeiten
    WHERE TätigkeitID IN ( 4, 5, 6)
    GROUP by userID
    having Count (TätigkeitID) = 3) t
    WHERE u.Userid = t.userID

    Oder habe ich es nur falsch verstanden?

    Grüße
    Biber
    warly bedankt sich. 

  13. #13
    warly warly ist offline Rookie
    Registriert seit
    Nov 2008
    Beiträge
    7
    Nein Super

    Genau richtig verstanden !

    Soweit war ich auch schon mal :

    PHP-Code:
    SELECT userID From Tätigkeiten
    WHERE TätigkeitID IN 
    456)
    GROUP by userID 
    Mir fehlte das :

    PHP-Code:
    having Count (TätigkeitID) = 3
    ...hätte ich auch drauf kommen können, mist

    Dein zweiter SQL Code ist also genau das was ich suche

    Echt super vielen Dank !!
     

  14. #14
    Avatar von Johannes7146
    Johannes7146 Johannes7146 ist offline Goldschnabel
    Registriert seit
    Sep 2007
    Ort
    Gütersloh
    Beiträge
    736
    Biber freut sich bestimmt über eine positive Bewertung und dann kannst du das Thema als "erledigt" markieren.
    warly bedankt sich. 
    Wenn mein Beitrag dir geholfen hat, würde ich mich sehr über eine positive Bewertung oder ein Danke freuen
    Gruß Johannes
    ::: Homepage :::

Ähnliche Themen

  1. Antworten: 20
    Letzter Beitrag: 06.01.12, 12:21
  2. SQL select abfrage - ergbis anzeigen bzw in Datei schreiben
    Von Blame im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 25.11.07, 20:03
  3. MySQL : Nicht funktionierende Abfrage, eventuell wegen MySQL-Version?
    Von shredder01 im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 17.11.07, 16:44
  4. Antworten: 4
    Letzter Beitrag: 03.03.05, 11:47
  5. Abfrage in tabelle schreiben
    Von cct im Forum PHP
    Antworten: 2
    Letzter Beitrag: 27.09.04, 15:13