Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Abfrage aus 2 mach eins

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Huette, 4 Mai 2013.

  1. Huette

    Huette Benutzer

    Hallo folgendes Problem:

    Ich habe 2 Tabellen:

    Mitarbeiter : Mitarbeiternummer, Name
    Qualifikation : Mitarbeiternummer, Laufende_Nr, Qualifikation

    Jetzt ist gefragt, welcher Mitarbeiter (Ausgabe: Mitarbeiternummer und Name) die meisten Qualifikationen hat.
    Ich würde das über 2 Abfragen lösen:

    Abfrage_1
    SELECT Mitarbeiter.Mitarbeiternummer, COUNT(*) AS Anzahl
    FROM Mitarbeiter, Qualifikation
    WHERE Mitarbeiter.Mitarbeiternummer=Qualifikation.Mitarbeiternummer
    GROUP BY Mitarbeiter.Mitarbeiternummer;

    Abfrage_2
    SELECT Mitarbeiternummer, Name
    FROM Mitarbeiter
    WHERE Mitarbeiternummer = (SelectMitarbeiternummer FROM Abfrage_1 Where Anzahl = (Select max(Anzahl) FROM Abfrage_1));

    bekomme ich das auch in eine Abfrage? jemand ne Idee ?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja. Du erweiterst Deinen JOIN passend.

    Hint: arbeite lieber mit expliziten statt impliziten JOINs.
     
  3. Huette

    Huette Benutzer

    wie ? und was heisst explizite Joins ?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Statt

    Code:
    ... from table1, table1 ... where table1.col = table2.col
    
    besser

    Code:
    ... from table1 left join table2 on (table1.col = table2.col)
    
    Man nimmt die JOIN-Condition aus dem WHERE, wo diese nur verwirrend in Erscheinung tritt, und behandelt sie extra im ON(...)

    Intelligente Systeme dröseln das selber auf, aber es ist definitiv besser lesbar und u.U. auch besser für den Planner verständlicher.
     
  5. Huette

    Huette Benutzer

    ah okay... aber ich habe jetzt garkein plan, wie ich die Abfragen so verändere, das es eine ist. Eine vorgehensweise wäre nicht schlcht...
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=# create table mitarbeiter (nummer int primary key, name text); 
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mitarbeiter_pkey" for table "mitarbeiter"
    CREATE TABLE                                                                                             
    Time: 4,265 ms                                                                                           
    test=*# create table quali (ma_nummer int references mitarbeiter, quali text);
    CREATE TABLE
    Time: 23,866 ms
    test=*# insert into mitarbeiter values (1, 'max');
    INSERT 0 1
    Time: 0,542 ms
    test=*# insert into mitarbeiter values (2, 'moritz');
    INSERT 0 1
    Time: 0,187 ms
    test=*# insert into quali values (1,'Grillmaster');
    INSERT 0 1
    Time: 0,576 ms
     
    --...
     
    test=*# select m.name, count(q.*) from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.name;
      name  | count
    --------+-------
     max    |     1
     moritz |     0
    (2 rows)
    
    Time: 0,432 ms
    
    Die Erweiterung dieser Abfrage auf die Mitarbeiternummer überlasse ich Dir zur Übung.

    Andreas
     
  7. Huette

    Huette Benutzer

    danke, aber der count soll ja nicht angezeigt werden. Nur name und Mitarbeiternummer und auch nur von dem der die meisten qualifikationen hat... Aber wenn ich count nicht im ersten Select mache, wo, wie dann ?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Was willst Du dann wissen?

    Zitat:
    Code:
    Jetzt ist gefragt, welcher Mitarbeiter (Ausgabe: Mitarbeiternummer und Name) die meisten Qualifikationen hat.
    
    Wie soll nun bewertet werten, wenn Mitarbeiter A 5 Qualis hat und Mitarbeiter B 7? Wer ist besser?

    Andreas
     
  9. Huette

    Huette Benutzer

    Ausgabe soll sein:

    Mitarbeiternummer | Mitarbeitername
    -----------------------|---------------------

    und zwar von dem, der der meisten Qualifikationen hat

    in deinem Beispiel müsste nur die mitarbeiternummer und der name von Mitarbeiter B angezeigt werden, da er die meisten qualis hat. Angenommen beide haben 7 qualis dann natürlich beide anzeigen lassen.......
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Es gibt keine Mitarbeiter B. Nur 1 und 2. Was wäre, wenn 2 oder mehr gleich viele Quais haben?

    Code:
    test=*# select m.nummer, m.name, count(q.*) from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name order by 3 desc limit 1;
     nummer | name | count
    --------+------+-------
          1 | max  |     1
    (1 row)
    
     
  11. Huette

    Huette Benutzer

    Wenn 2 oder mehr gleichviele qualis haben würden halt mehrere angezeigt. wenn nur einer die meisten hat, dann nur einer....
    Aber die Ausgabe soll trotzdem

    Mitarbeiternummer | Mitarbeitername sein... mehr nicht...
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=# select * from mitarbeiter ;
     nummer |  name
    --------+--------
          1 | max
          2 | moritz
    (2 rows)
    
    Time: 0,166 ms
    test=*# select * from quali ;
     ma_nummer |    quali
    -----------+-------------
             1 | Grillmaster
             1 | Biertrinker
             2 | Biertrinker
    (3 rows)
    
    Time: 0,153 ms
    test=*# select m.nummer, m.name from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name having count(q.*) = (select max(count) from (select ma_nummer, count(*) from quali group by ma_nummer) foo);
     nummer | name
    --------+------
          1 | max
    (1 row)
    
    Time: 0,496 ms
    test=*# insert into quali values (2,'Biertrinker');
    INSERT 0 1
    Time: 0,308 ms
    test=*# select m.nummer, m.name from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name having count(q.*) = (select max(count) from (select ma_nummer, count(*) from quali group by ma_nummer) foo);
     nummer |  name
    --------+--------
          2 | moritz
          1 | max
    (2 rows)
    
    Geht möglicherweise eleganter, aber dazu fehlt momentan noch der Kaffee...
     
  13. Huette

    Huette Benutzer

    Der mittlere sieht ganz gut aus. Ist der so in z.B. MS Access übertragbar ?

    vielen Dank !
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Ähm, LOL. Die beiden Abfragen sind identisch, ich habe nur noch einen Datensatz eingegeben, damit Dein 2. Wunsch demonstriert werden kann: "Wenn 2 oder mehr gleichviele qualis haben würden halt mehrere angezeigt."

    Was ist das?


    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden