Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Irgendein Join oder doch nur GROUP ???

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Irgendein Join oder doch nur GROUP ???

    Hallo,

    ich bin neu hier, so habt Nachsicht, wenn diese Frage schon gestellt wurde. Jedoch fällt mir auch kein passender Suchbegriff ein. Ich habe folgendes Problem:
    Ich habe eine Tabelle mit zwei Spalten (vereinfacht). In Spalte a sind viele Schlüssel (zeigen auf andere Tabellenzeilen) und in Spalte b ebenfalls. Nun kommen sowohl in Spalte a, als auch Spalte b beinahe alle Werte mehrfach vor. Beispiel:
    a b
    17 3
    15 4
    17 5
    17 6
    15 3 ...
    Ich möchte jetzt eine Abfrage haben, die mir zu einem vorgegebenem Schlüssel aus Spalte a sämtliche Schlüssel aus Spalte b liefert, also:

    SELECT b WHERE a=17;

    Als nächstes möchte ich nun wissen, wie häufig die gefundenen Schlüssel aus Spalte B überhaupt sonst noch vorkommen. Also:

    xx = Suchergebnis aus Abfrage 1
    SELECT COUNT(*) WHERE b = 'xx' GROUP BY b;

    Bei mehreren Suchergebnissen aus Anfrage 1 muss ich die 2. Anfrage jedoch recht häufig stellen. Ok, ich könnte es mittels OR auf eine weitere Suchabfrage beschränken, doch ist es recht unsauber, da ich nachher das Array wieder auseinanderfrickeln müsste.

    Gibt es eine elegantere Lösung als Befehl, der mir zum einen das Suchergebnis aus Abfrage 1 liefert, jedoch zusätzlich eine weitere Spalte in der die Häufigkeit des Vorkommens des Schlüssels in Spalte b liefert?

    Zur Erklärung: Es handelt sich bei Spalte a um Film-Identifikationsnummern und bei Spalte b um Personennummern. Ich möchte also zum einen eine Suchabfrage, die mir sämtliche Personen zu einem Film liefert, jedoch zusätzlich auch angibt, in wievielen Filmen diese Person insgesamt mitgewirkt hat.

    Vielen Dank für Eure Mühe schon einmal im voraus,

    Marco


  • #2
    Wenn ich dich richtig verstanden habe

    Code:
    SELECT  t1.a, t1.b, COUNT( t2.b ) anz
    FROM tabelle t1
    JOIN tabelle t2
    ON t1.b = t2.b
    WHERE t1.a =17
    GROUP BY t2.b
    Aber, du hast alles in einer Tabelle?
    Suche mal unter den Stichwort Normalisierung
    [edit]Uuups, es ist ja deine Schlüsseltabelle, betrachte also mein letzten Satz als nicht geschrieben [/edit]

    Kommentar


    • #3
      Es handelt sich lediglich um eine einzige Tabelle mit den angegebenen zwei Spalten. Auf dieser Tabelle möchte ich quasi zwei Abfragen nacheinander in eine packen. Es soll also zuerst die Zeilen gesucht werden, bei denen in Spalte a ein bestimmter Wert steht. Dann möchte ich für jeden gefundenen Wert aus Spalte b geliefert bekommen, wie häufig er insgesamt in der Tabelle steht.

      Die Ergebnistabelle aus dem obigen Beispiel müsste dann folgendermaßen aussehen, wenn man nach dem Wert 17 sucht:

      a------b-----count()
      17----3--------2
      17----5--------1
      17----6--------1

      Kommentar


      • #4
        Ja, habe ich voll verstanden.

        Und was macht mein Beispiel anders?

        Kommentar


        • #5
          Es gibt nur eine Tabelle, also nicht t1 und t2. Wenn ich den Befehl ausführe und beidesmal die gleiche Tabelle t1 angebe, kommt die SQL-Fehlermeldung

          #1066 - Not unique table/alias: 't1'

          Das funktioniert wohl doch nur mit verschiedenen Tabellen, oder

          Kommentar


          • #6
            Mach dich mal über ALIAS schlau.
            http://dev.mysql.com/doc/mysql/en/legal-names.html

            Um t1, t2 und anz handelt es sich jeweils um einen ALIAS.

            Da deine gesuchte Abfrage nur über einen JOIN durchführbar ist und ein JOIN über die gleiche Tabelle grundsätzlich ALIAS benötigt musst du diese angeben.

            "Blöder Satz, ist es schon so spät?"

            Deine Tabelle heisst "filmscha" mit den Feldern a und b lt. deiner Beschreibung.

            (-- ist in MSSQL ein Kommentar, bei MySQL bin ich mir jetzt nicht sicher)

            Code:
            SELECT  t1.a, t1.b, COUNT( t2.b ) anz
            -- Hole mir a und b von der Tabelle die den ALIAS t1 besitzt
            -- Zähle Feld b in der Tabelle die den ALIAS t2 besitzt und setze den ALIAS anz 
            -- (Beides ist die gleiche Tabelle, nur eben unterschiedlich referenziert)
            FROM filmscha t1
            -- Hier wird die Tabelle das erste mal referenziert
            JOIN filmscha t2
            -- und mit sich selbst verknüpft 
            -- (um MySQL eine Unterscheidung zu geben 
            -- muss hier eine andere Referenzierung (t2) angegeben werden.
            ON t1.b = t2.b
            -- hier folgt die Zuordnung der 2 Referenzierungen
            WHERE t1.a =17
            -- also in filmscha.a soll 17 stehen
            GROUP BY t2.b 
            -- hier ist t2 wichtig, da sich die COUNT()-Funktion auf die
            -- Refenzierung t2.b bezieht
            Ich hoffe damit alle Klarheiten beseitigt zu haben

            Wenn was unklar ist, fragen (ich bin mir nicht sicher, ob du mich überhaupt verstehst?)

            Das Stchwort "SELF JOIN" sollte dir jedenfalls schon mal weiter helfen.

            Kommentar


            • #7
              Ok. Ich habs verstanden. Das Problem bestand darin, dass MySQL ein "as" zwischen Tabellenname und Alias benötigt, also in der Art "... FROM filmscha as t1 ...".
              Ich bin damit n bisschen durcheinander gekommen.

              Vielen Dank, DiBo33, für deine Geduld

              Kommentar


              • #8
                Zitat von wunderkinnd
                Das Problem bestand darin, dass MySQL ein "as" zwischen Tabellenname und Alias benötigt
                Halte ich persönlich für ein Gerücht, oder welche uralt Version nutzt du?

                Kommentar

                Lädt...
                X