Ankündigung

Einklappen
Keine Ankündigung bisher.

Werte aus mehreren Tabellen abfragen

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Werte aus mehreren Tabellen abfragen

    Hallo zusammen,

    ich habe zwei MySQL-Tabellen, aus denen ich gerne in einer Abfrage Informationen erhalten möchte.

    Aufbau Tabelle 1:
    ID | Kunde
    (z.B. 4 | Meyer)

    Aufbau Tabelle 2:
    KuID | Datum | Kontaktaufname
    (z.B.: 4 | 2019-12-05 | Telefon)


    Nun suche ich eine Abfrage, die mir:
    - alle Kunden sortiert nach Datum der letzten Kontaktaufnahme
    - alle Daten und Anzahl der Kontaktaufnahmen anzeigt.

    Ausgabe in etwa:
    05.12.2019: Mayer (Gesamt: 4 Kontaktaufnahmen; am: 05.12.2019, 01.10.2019, 20.07.2019, 03.05.2019)
    02.12.2019: Schmitt (Gesamt: 2 Kontaktaufnahmen; am: 02.12.2019, 01.06.2019)
    04.11.2019: Müller (Gesamt: 3 Kontaktaufnahmen; am: 04.11.2019, 01.05.2019, 20.03.2019)
    usw.

    Kein Kundenname soll doppelt auftauchen.
    Ausgabe sortiert nach Datum der letzten Kontaktaufnahme
    Ausgab der Anzahl aller Kontaktaufnahmen
    Ausgabe der Daten der letzten Kontaktaufnahmen


    Ich weiß wie ich einzelne Abfrage in einer Tabelle machen kann. Aber eine Abfrage über zwei Tabellen hinweg ist für mich absolutes Neuland.

    Vielleicht hat hier jemand einen Lösungsweg (oder eine fertige Abfrage) für mich!

    Tausend Dank!

  • #2
    Du suchst einen JOIN in Verbindung mit max(), array_agg() (für PostgreSQL zumindest) und GROUP BY.

    Das wäre der Lösungsweg.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Vielen Dank für die rasche Antwort!
      Das ist mir jedoch etwas zu abstrakt.

      Vielleicht könntest du mir etwas konkreter weiterhelfen. Das wäre nett!!

      Vielen Dank!

      Kommentar


      • #4
        Code:
        bdrdemo=# create table kunden (id bigserial primary key, name text);
        CREATE TABLE
        bdrdemo=# create table kontakte (id bigserial primary key, kunden_id bigint references kunden, datum date);
        CREATE TABLE
        bdrdemo=# insert into kunden (name) values ('Mayer');
        INSERT 0 1
        bdrdemo=# insert into kunden (name) values ('Müller');
        INSERT 0 1
        bdrdemo=# select * from kunden;
                 id          |  name  
        ---------------------+--------
         1673850056534409217 | Mayer
         1673850156392398850 | Müller
        (2 rows)
        
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850056534409217, current_date-5);
        INSERT 0 1
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850056534409217, current_date-3);
        INSERT 0 1
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850056534409217, current_date-1);
        INSERT 0 1
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850156392398850, current_date - 7););
        INSERT 0 1
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850156392398850, current_date - 7);
        INSERT 0 1
        bdrdemo=# insert into kontakte (kunden_id, datum) values (1673850156392398850, current_date - 4);
        INSERT 0 1
        
            max     |  name  |             string_agg             
        ------------+--------+------------------------------------
         2019-12-01 | Müller | 2019-11-28, 2019-11-28, 2019-12-01
         2019-12-04 | Mayer  | 2019-11-30, 2019-12-02, 2019-12-04
        (2 rows)
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          PS.: falls sich jemand über die Sequencen wundert: das sind sog. Timeshard-Sequencen von BDR (Multi-Master-Replication), die konfliktfrei von unterschiedlichen Nodes vergeben werden können.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            In Mysql kennt machst du dann mit GROUP_CONCAT

            Code:
            SELECT max(`datum`) AS zuletzt, count(`datum`) AS Anzahl, GROUP_CONCAT(" " ,`datum`) Kontakte
            FROM `kontakte` k1
            LEFT JOIN `kunde` k2 ON k1.kunde_id = k2.id
            GROUP BY k1.kunde_id
            Die Formatierung des Datums in deine gewünschte Schreibweise überlasse ich mal dir.
            Siehe dazu unter https://dev.mysql.com/doc/refman/8.0...on_date-format

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              PS.: falls sich jemand über die Sequencen wundert: das sind ...
              Kann es sein, dass in Deinem Code der entscheidende Teil fehlt?

              Kommentar


              • #8
                fuck, ja.

                Code:
                bdrdemo=# select max(d.datum), k.name, string_agg(datum::text,', ') from kunden k left join kontakte d on k.id=d.kunden_id group by k.name;
                    max     |  name  |             string_agg             
                ------------+--------+------------------------------------
                 2019-12-01 | Müller | 2019-11-28, 2019-11-28, 2019-12-01
                 2019-12-04 | Mayer  | 2019-11-30, 2019-12-02, 2019-12-04
                (2 rows)
                Danke für den Hinweis, Copy&Paste will halt auch gelernt sein ...
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von Steffen.W Beitrag anzeigen
                  Vielen Dank für die rasche Antwort!
                  Das ist mir jedoch etwas zu abstrakt.

                  Vielleicht könntest du mir etwas konkreter weiterhelfen. Das wäre nett!!

                  Vielen Dank!
                  Kannst du bitte mal einen DB-Dump mit Deinen Daten hier posten: Alle relevanten Tabellen mit anonymisierten, zum Testen geeigneten Daten.

                  Kommentar


                  • #10
                    https://www.html.de/threads/mysql-ab...4/#post-400785

                    Kommentar


                    • #11
                      jonas3344 Oha...

                      Alf2016 ist in diesem Fall nicht notwendig.

                      Kommentar


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        jonas3344 Oha...

                        Alf2016 ist in diesem Fall nicht notwendig.
                        Ein gutes war trotzdem dran: GROUP_CONCAT. Echt super das Teil. Und man kann jederzeit aus dem String wieder ein Array machen. Jetzt bräuchte es nur noch temporäre Tabellen, wobei ja niemand daran gehindert wird, Tabellen anlegen zu lassen und wieder zu löschen, aber hübsch ist das nicht.

                        Kommentar


                        • #13
                          Siehe https://www.html.de/threads/mysql-ab...zaehlen.59534/
                          Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

                          Kommentar


                          • #14
                            Zitat von Alf2016 Beitrag anzeigen
                            Ein gutes war trotzdem dran: GROUP_CONCAT. Echt super das Teil. Und man kann jederzeit aus dem String wieder ein Array machen.
                            Dann vielleicht besser JSON_*AGG().

                            Zitat von Alf2016 Beitrag anzeigen
                            Jetzt bräuchte es nur noch temporäre Tabellen, wobei ja niemand daran gehindert wird, Tabellen anlegen zu lassen und wieder zu löschen, aber hübsch ist das nicht.
                            Temporäre Tabellen gibts seit "immer". Du meinst eher sowas wie JSON_TABLE() ? (das gibts aber erst seit Mysql 8 )

                            Kommentar


                            • #15
                              Was hat eine JSON_xy? mit der Frage des TE zu tun? Lösungen wurden bereits geliefert.

                              Kommentar

                              Lädt...
                              X