muenzchen: (MySQL) Tabellen verknüpfen?

Hallo!

Ich habe folgendes Problem:

In der 1. Tabelle stehen jede Menge IDs, sie können auch öfter vorkommen.

In der 2. Tabelle stehen Details zu diesen IDs.

Ich möchte jetzt die IDs aus der 1. Tabelle alle auslesen, nach Anzahl absteigend ordnen und dann mit den Details aus Tabelle 2 ausgeben.

Bis daher kein Problem. Aber es kann auch sein, dass IDs, die in Tabelle 2 sind, in Tabelle 1 nicht vorkommen, trotzdem will ich alle IDs ausgeben.

Das Problem an der Sache ist ja, dass IDs, die nicht in Tabelle 2 sind, dann nicht ausgelesen werden, auch nicht mit einer Anzahl von 0. Das bräuchte ich aber.

Wenn ich jetzt aber zuerst aus Tabelle 1 die IDs auslese, kann ich sie nicht mehr nach ihrem Vorkommen in Tabelle 2 ordnen.

Ich denke, dass das irgendwie mit Tabellen vernküpfen geht, habe aber keine Ahnung wie man das realisieren könnte. Ich habe mir die MySQL Doku darüber durchgelesen, aber nicht verstanden wie das funktionieren soll.

Vielen Dank schonmal, muenzchen

  1. Hallo!

    Ich habe folgendes Problem:
    In der 1. Tabelle stehen jede Menge IDs, sie können auch öfter vorkommen.
    In der 2. Tabelle stehen Details zu diesen IDs.
    Ich möchte jetzt die IDs aus der 1. Tabelle alle auslesen, nach Anzahl absteigend ordnen und dann mit den Details aus Tabelle 2 ausgeben.

    Ganz kann ich Dir nicht folgen, aber, wenn:

    Tabelle1
    ID
    1
    1
    4
    4
    1
    1
    3

    und:

    Tabelle2
    ID   Details
    1    Detail1
    2    Detail2
    3    Detail3
    4    Detail4
    5    Detail5

    ergibt:

    SELECT Tabelle1.ID, Tabelle2.Details
    FROM Tabelle1 RIGHT JOIN Tabelle2 ON Tabelle1.ID = Tabelle2.ID
    ORDER BY Tabelle2.ID DESC;

    ID   Details
         Detail5
    4    Detail4
    4    Detail4
    3    Detail3
         Detail2
    1    Detail1
    1    Detail1
    1    Detail1
    1    Detail1

    Einen Sinn kann ich in dieser Abfrage allerdings nicht erkennen ;-)

    viele Grüße

    Axel

    1. Die Abfrage hat schon Sinn.

      In Tabelle 1 stehen IDs mit zusätzlichem Text o.ä.

      In Tabelle 2 stehen die Details zu den IDs.

      Ich möchte auslesen, wie oft jede ID in Tabelle 1 vorkommt und sie dann absteigend nach der Anzahl geordnet mit den Details ausgeben.

      Das Problem ist aber, dass in Tabelle 2 auch IDs vorkommen können, die in Tabelle 1 nicht vorkommen, die sollen dann mit der Anzahl 0 azsgegeben werden.

      Und da liegt eben das Problem. Nur aus Tabelle 1 kann ich nicht auslesen, weil da einige IDs vielleicht nicht vorkommen. Lese ich aber nur aus Tabelle 2 aus, müsste ich dabei auch gleich nach der Anzahl ordnen. Die Anzahl bekomme ich aber nur heraus, wenn mit COUNT() oder so aus Tabelle 2 auch auslesen kann. Das muss alles in einem Zug gehen undda hänge ich.

      Ich habe JOIN, Right JOIN, usw. zwar in der MySQL Doku gefunden, aber für einen Anfänger wie mich ist das dort mehr als dürftig erklärt. Da habe ich nichts verstanden. Und sonst konnte ich auch nichts gescheites finden im Internet.

      Also was ich so erkennen kann könnte deine Abfrage schon mal so etwa hinkommen, aber leider verstehe ich noch immer nicht was da eigentlich passiert (RIGHT JOIN, ON ???)

      MfG, muenzchen

      1. Hallo,

        Die Abfrage hat schon Sinn.
        In Tabelle 1 stehen IDs mit zusätzlichem Text o.ä.
        In Tabelle 2 stehen die Details zu den IDs.
        Ich möchte auslesen, wie oft jede ID in Tabelle 1 vorkommt und sie dann absteigend nach der Anzahl geordnet mit den Details ausgeben.

        Ja, das mit der Anzahl hatte ich übersehen. Tabellenaufbau und -inhalt wie im ersten Posting:

        SELECT Tabelle1.ID, Tabelle2.Details, Count(Tabelle1.ID) AS anz
        FROM Tabelle1 RIGHT JOIN Tabelle2 ON Tabelle1.ID = Tabelle2.ID
        GROUP BY Tabelle1.ID, Tabelle2.Details
        ORDER BY Count(Tabelle1.ID) DESC;

        ID   Details    anz
        1    Detail1    4
        4    Detail4    2
        3    Detail3    1
             Detail5    0
             Detail2    0

        Erläuterugen:
        SELECT Tabelle1.ID, Tabelle2.Details, Count(Tabelle1.ID) AS anz
        --Wähle die Spalten Tabelle1.ID, Tabelle2.Details und die Anzahl gleicher Tabelle1.ID als Feld mit dem alias "anz",

        FROM Tabelle1 RIGHT JOIN Tabelle2 ON Tabelle1.ID = Tabelle2.ID
        --von Tabelle1(LEFT), verbunden mit Tabelle2(RIGHT) durch die Regel Tabelle1.ID = Tabelle2.ID, wobei die rechte(RIGHT) Seite(Tabelle2.ID) in jedem Fall angezeigt werden muss.

        GROUP BY Tabelle1.ID, Tabelle2.Details
        --fasse Datensätze mit gleichen Werten in Tabelle1.ID und Tabelle2.Details zusammen. Das ist notwendig für das Zählen(Count).

        ORDER BY Count(Tabelle1.ID) DESC;
        --sortiere das Ergebnis absteigend nach der ermittelten Anzahl.

        Um das mit LEFT- bzw. RIGHT JOIN zu verdeutlichen:

        SELECT Tabelle1.ID, Tabelle2.Details, Count(Tabelle1.ID) AS anz
        FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle1.ID = Tabelle2.ID
        GROUP BY Tabelle1.ID, Tabelle2.Details
        ORDER BY Count(Tabelle1.ID) DESC;

        ergibt das selbe Ergebnis.

        viele Grüße

        Axel

        1. Hallo!

          Also erstmal vielen Dank, dass du dir die Mühe machst mir das zu erklären. Das hilft mir wirklich.

          Mir ist beim Ausprobieren jetzt noch ein Missverständnis aufgefallen.

          Die Details aus Tabelle 2 sind beim Auslesen eigentlich unwichtig. Die kann ich dann während der Ausgabe mit PHP auslesen. Was ich allerdings aus Tabelle 2 brauche sind auch die IDs, die in Tabelle 1 vielleicht gar nicht vorkommen. Die werden mir leider immer noch nicht ausgegeben. Ich bekomme nur die IDs mit Anzahl zurück, die auch mindestens einmal in Tabelle 1 vorkommen.

          Ich hab zwar versucht selbst was zu ändern, das hat aber auch nicht geholfen :)

          Vielleicht kannst du mir da noch etwas unter die Arme greifen.

          Danke und mfG, muenzchen

          1. Hallo,

            Die Details aus Tabelle 2 sind beim Auslesen eigentlich unwichtig. Die kann ich dann während der Ausgabe mit PHP auslesen. Was ich allerdings aus Tabelle 2 brauche sind auch die IDs, die in Tabelle 1 vielleicht gar nicht vorkommen. Die werden mir leider immer noch nicht ausgegeben. Ich bekomme nur die IDs mit Anzahl zurück, die auch mindestens einmal in Tabelle 1 vorkommen.

            Tabelle1
            ID
            1
            1
            1
            1
            3
            4
            4

            Tabelle2
            ID   Details
            1    Detail1
            2    Detail2
            3    Detail3
            4    Detail4
            5    Detail5

            SELECT Tabelle2.ID, Count(Tabelle1.ID) AS IDanzT1
            FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle2.ID = Tabelle1.ID
            GROUP BY Tabelle2.ID
            ORDER BY Count(Tabelle1.ID) DESC;

            ID   IDanzT1
            1    4
            4    2
            3    1
            5    0
            2    0

            So? Sonst müsstest Du mal Deine Tabellenstruktur posten und was als Ergebnis rauskommen soll ;-))

            viele Grüße

            Axel

            1. Hallo!

              Die Struktur ist genauso wie du es jetzt aufgezeigt hast.

              Genau das als Ergebnis zu bekommen wäre mein Ziel.

              Jetzt bekomme ich aber diese Fehlermeldung: Not unique table/alias: 'Tabelle1'

              Er hat scheinbar Probleme mit dem LEFT JOIN Tabelle1. Wenn ich das in LEFT JOIN Tabelle2 ändere gehts wieder, aber er gibt nicht die IDs aus, die 0 mal vorkommen.

              MfG, muenzchen

              1. Hallo,

                Jetzt bekomme ich aber diese Fehlermeldung: Not unique table/alias: 'Tabelle1'

                Tabelle1 ist kein eindeutiger Tabellenname oder Alias.
                Gibt es die "Tabelle1"? Groß- und Kleinchreibung beachten!

                viele Grüße

                Axel

                1. Hallo!

                  Ich habe einen Fehler reingemacht!

                  Jetzt funktionierts!

                  Vielen Dank, du bist ein Genie.

                  MfG, muenzchen