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 Count Problem

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Plastefuchs, 29 April 2015.

  1. Plastefuchs

    Plastefuchs Neuer Benutzer

    Hallo,

    Ich bin ziemlich Neu auf dem Gebiet der Verwendung von SQL und stehe derzeit vor einem blöden Problem.

    Es geht um ein Programm, um eleketronisch zu erfassen, welche Person sich ein Gerät bei mir ausgeliehen hat.

    Es gibt eine Tabelle "Personen" sowie eine Tabelle "Hardware".
    In der Tabelle Hardware ist u.a. der Hersteller, Typ, Seriennummer usw. von dem jeweils eingetragenen Gerät hinterlegt. Wenn eine Person sich Material ausborgt, so wird die ID dieser Person aus der Spalte "Personen" in die Spalte "MAL" aus der Tabelle Hardware eingetragen. Somit kann ich das gesamte Material einer Person über die Abfrage

    "Select ... FROM Hardware WHERE Personen.ID = Hardware.MAL;"


    abfragen.

    Jetzt möchte ich allerdings eine Abfrage gestalten, welche die anzahl der Geräte anzeigt, welche eine bestimmte Person derzeit hat.

    Die Ausgabe soll dann in entwa so aussehen:

    Müller - 3
    Meier - 0
    Schmidt - 5

    Leider komme ich nicht darauf wie der Befehl korrekt zu definieren ist.
    Derzeit habe ich es mit der Abfrage

    "SELECT COUNT(Hardware.MAL), Personen.Nachname FROM Hardware, Personen WHERE Hardware.MAL = Personen.ID;"

    versucht.

    Diese bringt allerdings nur einen einzelnen Namen zusammen mit der Gesamtzahl aller ausgegebenen Geräte.

    Wo liegt der Fehler?

    Vielen Dank im Vorraus.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Gewöhn Dir bitte expliziete Joins an, das ist einfach sauberer und besser lesbar. In Deiner Abfrage fehlt zumindest ein GROUP BY. Alle Datenbanken und in der Zukunft auch mySQL würden/werden Dir bei diesem Select so sofort Syntaxfehler um die Ohren geworfen.
     
  3. Plastefuchs

    Plastefuchs Neuer Benutzer

    Hallo und danke für die schnelle Antwort.

    Ich habe jetzt einfach mal den Befehl

    SELECT COUNT(Hardware.MAL), Personen.Nachname FROM Hardware, Personen WHERE Hardware.MAL = Personen.ID GROUP BY Personen.Nachname;

    Getestet und dieser scheint auch zu fuktionieren. Leider zeigt er mir nur die Personen an, welche mindestens ein Gerät haben. Gibt es eine möglichkeit auch die Personen anzuzeigen, bei dennen der Count auf 0 steht?

    Ich bin mir nicht ganz sicher wie genau das mit den ganzen verschiedenen JOIN-Arten funktoniert. Ich hatte bereits versucht mich über Google darüber schlau zu machen, jedoch hat mich das größtenteils eher verwirrt.

    Warum würde eine neue MySQL-Version mir einen Syntaxfehler bringen? Was ist denn falsch an meiner Schreibweise?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Du suchst einen left Outer Join, machst aber aufgrund der schlampigen Syntax einen Inner join.

    Code:
    test=# create table master (id int primary key);
    CREATE TABLE
    test=*# create table slave (m_id int references master);
    CREATE TABLE
    test=*# copy master from stdin;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 1
    >> 2
    >> 3
    >> \.
    COPY 3
    test=*# copy slave from stdin;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 2
    >> 2
    >> 3
    >> \.
    COPY 3
    test=*# select m.id, count(s.m_id) from master m left join slave s on m.id=s.m_id group by m.id;
     id | count
    ----+-------
      1 |  0
      2 |  2
      3 |  1
    (3 rows)
    
    test=*# select m.id, count(s.m_id) from master m,slave s where m.id=s.m_id group by m.id;
     id | count
    ----+-------
      2 |  2
      3 |  1
    (2 rows)
    
    test=*# select m.id, count(s.m_id) from master m inner join slave s on m.id=s.m_id group by m.id;
     id | count
    ----+-------
      2 |  2
      3 |  1
    (2 rows)
    
    In Deinem ersten Versuch hattest Du kein GROUP BY. Das ist ein grober Syntaxfehler, den MySQL aber ignoriert und dafür falsche (Zufalls)werte liefert.

    Sondermüll halt.
     
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