Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle mit COUNT() auswerten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabelle mit COUNT() auswerten

    Ich habe eine kleine Namens-Tabelle. Der Eintrag "Frau Inge Meyer" kommt 3x in der Tabelle vor.

    Ich richtige Tabelle ist viel größer und ich möchte diese nun auswerten.

    Wie oft kommen die einzelnen Einträge vor und das nach häufigkeit sortiert.

    Also hier wäre das Ergebniss:
    Frau Inge Meyer 3x
    Herr Gerd Müller 1x
    Herr Hans Schmidt 1x
    Herr Hans Müller 1x

    PHP-Code:
    CREATE TABLE IF NOT EXISTS `names` (
      `
    Anredevarchar(100NOT NULL,
      `
    Vornamevarchar(255NOT NULL,
      `
    Nachnamevarchar(255NOT NULL
    ENGINE=MyISAM DEFAULT CHARSET=latin1;

    --
    -- 
    Daten für Tabelle `names`
    --

    INSERT INTO `names` (`Anrede`, `Vorname`, `Nachname`) VALUES
    ('Herr''Gerd''Müller'),
    (
    'Frau''Inge''Meyer'),
    (
    'Herr''Hans''Schmidt'),
    (
    'Frau''Inge''Meyer'),
    (
    'Herr''Hans''Müller'),
    (
    'Frau''Inge''Meyer'); 
    Danke für jede Hilfe


  • #2
    So eine SQL-Auswertung erfolgt mit GROUP BY und sollte in etwas so gehen (sofern ich mich nicht vertippt habe)

    Code:
    SELECT nachname, vorname, anrede, COUNT(*) AS anzahl
      FROM names
    GROUP BY nachname, vorname, anrede  
    ORDER BY nachname, vorname, anrede;
    Bitte mal überlegen, ob die VARCHAR Spalten wirklich so groß sein müssen.

    Grüße
    Thomas

    Kommentar


    • #3
      Danke es funktioniert, ich hatte noch nie was mit GROUP BY gemacht.

      Was empfiehlst du für die VARCHAR ?

      Kommentar


      • #4
        Wie lang die VARCHAR definiert werden soll, hängt natürlich von den "erwarteten" Daten ab.

        Du kannst aber so testen, wie lang die bisher längste vorhandene Feldlänge ist. Nun kann Du ja dann 20% dazutun oder so...
        Code:
        SELECT MAX(LENGTH(nachname)) AS max_nachname,
               MAX(LENGTH(vorname)) AS max_vorname,
               MAX(LENGTH(anrede)) AS max_anrede
          FROM names;
        Grüße
        Thomas

        Kommentar


        • #5
          Außerdem würde sich ein fortlaufender Index anbieten, meistens "id" genannt, der jeden einzelnen Eintrag eindeutig kennzeichnet, wie willst du die Richtige Person raussuchen, wenn du 3 Ergenbnisse zurück bekommst.
          Für solche Spalten nimmt man dann auch noch auto_increment.
          "My software never has bugs, it just develops random features."
          "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

          Kommentar


          • #6
            Wenn du in eine mit varchar(255) definierte Spalte einen Namen mit 5 Zeichen speicherst, dann werden auch nur 5 Zeichen Speicherplatz (plus 1 Byte für die Länge) verbraucht. Der Rest wird nicht mit z.B. Leerzeichen aufgefüllt. varchar(255) ist allerdings auch so eine Pseudo-IT-Zahl, weil die (Fast-)Zweierpotenz genauso gut ist wie z.B. varchar(361) oder varchar(5761). (Einziger Unterschied: ab varchar(256) werden immer zwei Bytes für die Länge des gespeicherten Strings benötigt).
            PHP-Code:
            if ($var != 0) {
              
            $var 0;

            Kommentar


            • #7
              Zitat von Wolla Beitrag anzeigen
              Wenn du in eine mit varchar(255) definierte Spalte einen Namen mit 5 Zeichen speicherst, dann werden auch nur 5 Zeichen Speicherplatz (plus 1 Byte für die Länge) verbraucht.
              Stimmt, dies gilt für das Speichern von VARCHAR auf der Platte, aber nicht für den RAM und damit nicht aus Sicht der Performance. Soweit ich weiß, belegt ein VARCHAR(255) eben auch 255 Byte im Memory unabhängig von den gefüllten x Zeichen. Dies gilt eventuell nicht für alle MySQL-Engines. (Quelle: High Performance MySQL 2nd Edition Seite 86).

              Deshalb ist es aus meiner Sicht besser, nicht unnötig große Spalten zu definieren.

              Grüße
              Thomas

              Kommentar


              • #8
                Entschuldigung das ich mich erst jetzt wieder melde, das einspielen der DB hat ein wenig gedauert bevor ich den Befehl testen konnte. Aber so weit ich das überblicken kann scheint es zu funktionieren.

                Danke nochmals an alle die geholfen haben.

                Kommentar

                Lädt...
                X