Yadgar: MySQL: Stichwörter gruppiert mit allen Vorkommen anzeigen

Hi(gh)!

Zwei Tabellen: eine für Stichwörter im Klartext, eine mit den Vorkommen der Stichwörter in den einzelnen Tagebucheinträgen.

Struktur:

Tabelle STICHWOERTER:

nr (unsigned smallint, primary index, auto_increment)
stichwort (varchar(120))

Tabelle STICHWORT_DATUM:

nr (unsigned mediumint, primary index, auto_increment)
stichwoerter_nr (unsigned smallint)
datum (date)

Wenn ich folgende Query eingebe:

SELECT stichwort, datum
FROM STICHWOERTER, STICHWORT_DATUM
WHERE stichwoerter_nr = STICHWOERTER.NR
GROUP BY stichwort
ORDER BY stichwort

werden mir zwar alle Stichwoerter in alphabetischer Reheinfolge angezeigt, allerdings nur mit dem jeweils frühesten Vorkommen.

Wie bekomme ich es hin, dass jedes Stichwort mit allen Vorkommen (diese dann idealerweise wieder nach Datum aufsteigend geordnet) angezeigt wird?

Bis bald im Khyberspace!

Yadgar

Edit Rolf B: Tabellendefinition und SQL formatiert

  1. Hi,

    Zwei Tabellen: eine für Stichwörter im Klartext, eine mit den Vorkommen der Stichwörter in den einzelnen Tagebucheinträgen.

    Struktur:

    Tabelle STICHWOERTER:

    nr (unsigned smallint, primary index, auto_increment) stichwort (varchar(120))

    Tablelle STICHWORT_DATUM: nr (unsigned mediumint, primary index, auto_increment) stichwoerter_nr (unsigned smallint) datum (date)

    Wenn ich folgende Query eingebe:

    SELECT stichwort, datum FROM STICHWOERTER, STICHWORT_DATUM WHERE stichwoerter_nr = STICHWOERTER.NR GROUP BY stichwort ORDER BY stichwort

    werden mir zwar alle Stichwoerter in alphabetischer Reheinfolge angezeigt, allerdings nur mit dem jeweils frühesten Vorkommen.

    Nein, mit einem zufälligen.

    Die meisten Datenbanken verlangen bei Verwendung von Group by, daß die selektierten Werten entweder Spalten, nach denen gruppiert wird, sind, oder aber aggregierte Werte (COUNT, SUM, MIN, MAX, AVG, ...)

    MySQL ist da eine Ausnahme (wobei man das m.W. inzwischen auch abschalten kann).

    MySQL kennt, IIRC, die Aggregats-Funktion GROUP_CONCAT (oder so ähnlich)

    cu,
    Andreas a/k/a MudGuard

    1. Hi,

      MySQL kennt, IIRC, die Aggregats-Funktion GROUP_CONCAT (oder so ähnlich)

      Und was kann ich damit anfangen?

      1. Hi,

        MySQL kennt, IIRC, die Aggregats-Funktion GROUP_CONCAT (oder so ähnlich)

        Und was kann ich damit anfangen?

        sie benutzen.

        Wenn Du erwartest, daß Dir hier jemand das MySQL-Handbuch vorliest, könntest Du enttäuscht werden.

        cu,
        Andreas a/k/a MudGuard

        1. Wenn Du erwartest, daß Dir hier jemand das MySQL-Handbuch vorliest, könntest Du enttäuscht werden.

          Ich weiß ja nicht einmal, wo ich dieses Handbuch (genauer: zu Version 7.4) finde - die Links ändern sich ständig! Und, nein, Google ist niemandes Freund!

          1. Schlimmer noch, ich weiß nicht eimmal wirklich, welche MySQL-Version auf meinem lokalen Apache-Server läuft! Wie finde ich das heraus?

            1. Hallo

              Schlimmer noch, ich weiß nicht eimmal wirklich, welche MySQL-Version auf meinem lokalen Apache-Server läuft! Wie finde ich das heraus?

              Indem du die Suchmaschine deines geringsten Misstrauens befragst. Google scheint das nicht zu sein, aber wie man eine Frage in irgend eine andere Suchmaschine eingibt, wirst du doch wissen, oder?

              Tschö, Auge

              --
              200 ist das neue 35.
              1. Ihr Nerds seid so kalt und arrogant!

                1. Hallo

                  Ihr Nerds seid so kalt und arrogant!

                  Sorry, aber das werde ich nicht so stehen lassen. Du bist hier nicht erst seit gestern dabei. Du solltest also wissen, dass wir hier nicht alles vorkauen, sondern Hilfe zur Selbsthilfe geben wollen.

                  Anstatt die Frage, wie man die Version einer MYSQL-Installation ermittelt, in eine Suchmaschine einzugeben, hier nachzufragen, wie man das macht, ist für mich exakt die Definition von „sich etwas vorkauen lassen zu wollen“.

                  Tschö, Auge

                  --
                  200 ist das neue 35.
                  1. Anstatt die Frage, wie man die Version einer MYSQL-Installation ermittelt, in eine Suchmaschine einzugeben, hier nachzufragen, wie man das macht, ist für mich exakt die Definition von „sich etwas vorkauen lassen zu wollen“.

                    Ich hasse Suchmaschinen und bin gleichzeitig süchtig danach, sie zu benutzen... das Internet ist mein Heroin! Ich weiß, dass es mich kaputt macht, mein Denken, meine Moral und meine geistige Gesundheit zersetzt, aber ich kann einfach nicht ohne leben!

                    1. MySQL, PHP, C++, C, HTML, CSS, SVG, Javascript... ich weiß gar nicht, wann ich das alles lernen soll! Meine Tage haben auch nur 24 Stunden (von denen ich 8 verschlafen muss, um bei halbwegs klarem Verstand zu bleiben), und da ich nicht in einem Programmierer-Boardinghouse mit Hotelservice residiere, grätscht mir auch noch alle Nasenlang irgendwelche schnöde Alltagsscheiße rein! Spülenputzenaufräumenessenkochenkackeneinkaufen... ich will hier raus!!!

                      Und dabei wollte ich ursprünglich gar kein Computerfreak werden, sondern ein langhaariger Aussteiger auf dem Hippie Trail, mit dem Fahrrad quer durch Afghanistan nach Indien...

                      1. Hallo Yadgar,

                        C und C++ kannst Du weglassen. SVG ist optional - wenn auch nützlich.

                        Der Rest - ja. Webentwicklung ist kein Kinderspiel, und wenn Du erwartest, das Thema mit einer Stunde Aufwand am Tag in einem Vierteljahr zu beherrschen, dann musst Du zwangsläufig enttäuscht werden.

                        Mein bisheriger Aufwand: 3 Jahre zu Anfang der 2000er, da mit C# und ASP.NET als Kapsel um HTML. Da habe ich auf HTML/CSS/JS Ebene nur herumgestümpert. Es war auch wirklich eine Strafe, für IE4 oder IE5.5 Webseiten zu bauen. In 2010 habe ich eine andere ASP.NET Anwendung in Pflege nehmen müssen, aber auch nur gestümpert. Parallel habe ich den Turniermanager von carcassonne-online.info (mittlerweile offline) mit betreut und weiterentwickelt, DA habe ich mich über 3 Jahre weg in die Grundlagen eingefuchst und am schlechten Beispiel des Erst-Entwicklers eine Menge gelernt. In dieser Zeit dürfte ich jeden Tag ca 2 Stunden am Thema gewesen sein, parallel zum Beruf (wo ich mit Web kaum zu tun hatte).

                        Und die letzten Jahre bin ich bei SelfHTML recht aktiv und lerne ständig dazu, vor allem dadurch, dass ich viel recherchiere, um Fragen beantworten und Wikiartikel schreiben zu können. Zeitaufwand: priceless... Aber es hat mir immerhin auch im Beruf geholfen, wo ich eine Webseite weiterentwickeln musste. Und ja, ein Real Life™️ ist auch noch da.

                        Man braucht JAHRE. Viele Jahre. Jeder von uns.

                        Bin ich ein Experte? Bei weitem nicht. Ich bin eher wie ein Anwalt. Ein solcher sagte mir mal: Anwälte können alles. Aber nichts richtig.

                        ein langhaariger Aussteiger auf dem Hippie Trail, mit dem Fahrrad quer durch Afghanistan nach Indien

                        Ein schönes Ziel. Ich wünsche Dir, dass es eine Route gibt, auf der das möglich ist, bevor es Dir wie mir geht und die Haare weg sind. Derzeit muss man wohl - wenn es mit Pedalantrieb gehen soll - wohl eher mit dem Tretboot von Sur/Oman nach Guhar Moti. Schlappe 940km 😂

                        Rolf

                        --
                        sumpsi - posui - obstruxi
                        1. Hallo Rolf,

                          Anwälte können alles. Aber nichts richtig.

                          dann haben sie ja was mit MS Outlook gemeinsam. Mailclient, Kontakte Kalender, Terminplaner. Alles da. Aber nichts wirklich so, dass es mich zufriedenstellen würde.

                          Neulich wieder spöttisch gelacht: Outlook erinnert mich auch noch an Termine, die ich förmlich abhelehnt habe.

                          ein langhaariger Aussteiger auf dem Hippie Trail, mit dem Fahrrad quer durch Afghanistan nach Indien

                          Ein schönes Ziel.

                          Geschmackssache. Mich würde das nicht reizen.

                          Derzeit muss man wohl - wenn es mit Pedalantrieb gehen soll - wohl eher mit dem Tretboot von Sur/Oman nach Guhar Moti. Schlappe 940km 😂

                          Nette idee. 😉
                          Da müsste man wohl reichlich Trinkwasser und Proviant mitnehmen (Sonnencreme nicht vergessen), zu zweit sein (damit man sich im 4h-Takt beim Treten ablösen kann), und ein Baldachin gegen die Sonne wäre auch nicht schlecht. Aber das fände ich immerhin reizvoller als mit dem Fahrrad durch die Knüste.

                          Was schafft man mit dem Tretboot, wenn man mit den Kräften einigermaßen haushalten muss? 2..3km/h? Dann könnte man die Strecke ja in weniger als 3 Wochen schaffen. Wenn keine Stürme, Piraten oder Haie dazwischenfunken. 🤣

                          May the Schwartz be with you
                           Martin

                          --
                          Theorie ist, wenn eigentlich jeder weiß, wie's gehen müsste, und es geht doch nicht.
                          Praxis ist, wenn's geht, obwohl es keiner so richtig versteht.
                          Bei uns sind Theorie und Praxis vereint: Nichts geht, und keiner weiß, warum.
                      2. Hallo

                        MySQL, PHP, C++, C, HTML, CSS, SVG, Javascript... ich weiß gar nicht, wann ich das alles lernen soll!

                        Sollst, musst, willst du das alles lernen? Ich bin davon ausgegangen, dass du zumindest in einem Teil der genannten Kürzel firm bist. Du bist hier ja nun auch schon vor vielen Jahren (April 2005) aktiv geworden.

                        Meine Tage haben auch nur 24 Stunden (von denen ich 8 verschlafen muss, um bei halbwegs klarem Verstand zu bleiben), und da ich nicht in einem Programmierer-Boardinghouse mit Hotelservice residiere, grätscht mir auch noch alle Nasenlang irgendwelche schnöde Alltagsscheiße rein! Spülenputzenaufräumenessenkochenkackeneinkaufen... ich will hier raus!!!

                        Es tut mir leid, wenn dich das alles überfordert.

                        Bis auf „ich will hier raus!!!“ sind wir alle all diesen Anforderungen ausgesetzt. Einer kommt damit besser zurecht als ein anderer und jeder versucht, damit auf die eine oder andere Weise umzugehen. Wenn es aber zuviel wird, muss man bereit sein, los und sich helfen zu lassen. Wenn du mit der obigen Aufzählung von Sprachen überfordert sein solltest, schränke die Auswahl ein. Oder mache stattdessen oder zwischendurch etwas mit Holz oder Metall. Das kann sehr entspannend sein.

                        Dass du dich – was ich nach deiner Aussage zumindest vermute – selbst so derartig unter Druck setzt, wie es den Anschein hat, ist jedenfalls gänzlich, überhaupt und gar nicht gut.

                        Tschö, Auge

                        --
                        200 ist das neue 35.
              2. Gibt es keine Möglichkeit, das lokal herauszufinden? Muss ich immer wieder in diese stinkende Info-Kloake namens Internet tauchen? Es ekelt mich mittlerweile!

                1. Hallo,

                  Die Quelle des Gestanks musst du bei Dir suchen. Die bisherigen Internetprotokolle sind geruchsneutral.

                  Gruß
                  Kalk

                  1. Hallo,

                    Die Quelle des Gestanks musst du bei Dir suchen. Die bisherigen Internetprotokolle sind geruchsneutral.

                    Ja, die Protokolle... die Inhalte in der Regel ganz und gar nicht! Was einem Google typischerweise bei einer beliebigen Suchanfrage auf den Bildschirm sch(m)eißt ist viel zu oft einfach nur zum saftig Abreihern!

          2. Hallo Yadgar,

            wir SelfNerds sind nicht kalt und arrogant, aber relativ ungnädig mit Leuten, die nicht gestern erst angefangen haben und nicht mal wissen, wo die Doku steht. Die Homepages der Tools, die man verwendet, sollte man kennen.

            Man sollte auch wissen, welche Software welche Version hat. Es gibt PHP 7.4 (www.php.net), aber kein Mysql 7.4. Bei MySQL gab es einen Sprung von 5.7 nach 8.0. Der Spinoff MariaDB ist von Version 5.5 nach Version 10 gesprungen. Apache ist typischerweise Version 2.4.

            Das einfachste Verfahren zur Bestimmung der DB Server Version ist

            SELECT VERSION()
            

            Verwendest Du phpmyadmin? Da gibt's eine Infoseite über den DB-Server mit der genauen Version. Es müsste Dir auch die genaue PHP Subversion anzeigen - die bekommst Du aber auch, wenn Du Dir eine Test-PHP Datei machst, die nicht mehr als

            <?php
            phpinfo();
            

            enthält. Bitte eine solche Seite nicht auf einen öffentliche Server stellen, sie verrät einem Hacker zu viel.

            Bei einer lokalen MYSQL Installation könnte auch die MySQL Workbench dabei sein; die sollte Dir die Version des DB Servers auch anzeigen können. Bei MariaDB ist HeidiSQL eine Alternative (zumindest unter Windows).

            Links:

            https://www.php.net/manual/de/ - alle Versionen

            https://dev.mysql.com/doc/refman/8.0/en/ (rechts oben ist eine Versionsauswahl)
            bzw.
            https://mariadb.org/documentation/ (oben ist eine Versionsauswahl)

            Bei MariaDB muss man aufpassen, es gibt die kommerzielle Version (mariadb.com) und die Community-Version (mariadb.org).

            http://httpd.apache.org/docs/2.4/ (deutsch und englisch verfügbar)

            Deine eigentliche Frage guck ich mir jetzt an.

            Rolf

            --
            sumpsi - posui - obstruxi
  2. Hallo Yadgar,

    Wie bekomme ich es hin, dass jedes Stichwort mit allen Vorkommen (diese dann idealerweise wieder nach Datum aufsteigend geordnet) angezeigt wird?

    Beachte: DB-Abfrage und Anzeige der Daten sind normalerweise zwei paar Schuhe. Du kannst Dir vom DB Server natürlich helfen lassen, deine Anzeige vorzubereiten, aber immer geht das nicht.

    Es kommt auch darauf an, wie deine Anzeige aussehen soll. Es kann eine Liste sein, wo pro Stichwort und Datum jeweils eine neue Zeile erstellt wird. Oder eine Liste, wo hinter dem Stichwort in einer Zeile die benutzten Datumswerte stehen.

    Nach der reinen Lehre ist nur die erste Variante etwas, wonach man einen Datenbankserver fragen sollte. Die Aufbereitung für die Anzeige, wie das Sammeln von Werten in einer Zeile, ist Sache der Anwendung. Ein Server, der etwas auf sich hält, rümpft darüber die Nase.

    Aber MYSQL ist Kummer gewohnt und bietet mit GROUP_CONCAT Hilfe. Oracle bietet LISTAGG, und sogar die Hochnasen von Microsoft haben im SQL Server 2017 die STRING_AGG Funktion hinzugefügt.

    Also - eine rein relationale Antwort gibt's so, ohne GROUP BY.

    SELECT st.stichwort, sd.datum
    FROM STICHWOERTER st, STICHWORT_DATUM sd
    WHERE sd.stichwoerter_nr = st.NR
    ORDER BY st.stichwort, sd.datum
    

    Ich habe den Tabellen Aliasnamen gegeben (st und sd), damit die Präfixe vor den Spaltennamen kürzer sind.

    Eine Sammlung der Datümer auf einer Zeile braucht entweder eine Aufbereitung der Anzeige mit PHP, oder im SQL ein Konstrukt aus GROUP BY und GROUP_CONCAT (guckst Du hier für Doku und Beispiele).

    Mit SQL bekommst Du aber nur eine einfache Komma-Auflistung. Wenn Du die Ausgabe mit HTML formatieren willst, bist Du mit einer PHP Aufbereitung vermutlich besser dran.

    Rolf

    --
    sumpsi - posui - obstruxi