nclaasen: Tabelle ohne Subquery vor join sortieren

Moin Leute!

Ich habe folgendes Problem:
Ich habe eine Datenbank mit 2 Tabellen mit folgender Struktur:

blocklist:
BlockID: int(11) auto_increment Primärschlüssel
hash: text
blocked: smallint(6)
comment: text

blocklistnames
BNID: int(11) auto_increment Primärschlüssel
BlockID: int(11)
name: text
aufrufe: int(11)

Die beiden Tabellen sollen verbunden und in einer View gespeichert werden.

Verbunden werden können sie mit folgendem SQL Befehl

SELECT T1.BlockID, T1.comment, T2.name AS maxname, T2.aufrufe AS maxnameaufrufe, SUM(T2.aufrufe) AS gesaufrufe, T1.blocked
FROM blocklist T1 LEFT JOIN (SELECT * FROM blocklistnames ORDER BY aufrufe DESC) AS T2 ON T1.BlockID = T2.BlockID
GROUP BY T1.BlockID, T2.BlockID
ORDER BY T1.BlockID

Leider kann ich das nicht in eine View speichern, da sie keine Subqueries  wie diesen enthalten dürfen:
(SELECT * FROM blocklistnames ORDER BY aufrufe DESC) AS T2

Allerdings brauche ich diesen Subquery damit maxname und maxnameaurufe wirklich der eintrag mit den meisten Aufrufen und nicht mit dem kleinsten Index ist. Kennt jemand eine andere Methode um die Tabelle vorsortieren zu können?

Ich benutze übrigens mysql 5.0.51a-24+lenny3.

MFG

nclaasen

  1. Mahlzeit nclaasen,

    Ich habe folgendes Problem:

    Das wissen wir.

    Und Du solltest wissen, dass Doppelpostings hier nicht erwünscht sind.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Tut mir Leid, es kann sein, dass ich einmal vergessen habe auf "Vorschau generieren" zu klicken, aber eigentlich hätte ich das bemerken müssen. Ein Doppelpost war nicht meine Absicht (und wie es aussieht ist er auch mittlerweile gelöscht).

    2. Moin EKKi,

      Das wissen wir.

      Ja, jetzt nicht mehr - da hat wohl einer versehentlich das erste Posting gelöscht anstatt des doppelt geposteten.

      Egal, der Hinweis darauf,

      dass Doppelpostings hier nicht erwünscht sind.

      kann ja mal nie schaden. Ich setze jetzt deinen Doppelposting-Hinweis und meine Antwort auf Noanswer, in der Hoffnung, dass der OP trotzdem noch Antworten bekommt (denn das zweite Posting ist ja mal raus, da ist eine Antwort nicht mehr möglich).

      File Griese,

      Stonie

      --
      It's no good you trying to sit on the fence
      And hope that the trouble will pass
      'Cause sitting on fences can make you a pain in the ass.
      Und im Übrigen kennt auch Stonie Wayne.
  2. Allerdings brauche ich diesen Subquery damit maxname und maxnameaurufe wirklich der eintrag mit den meisten Aufrufen und nicht mit dem kleinsten Index ist.

    Wenn du das hier - (SELECT * FROM blocklistnames ORDER BY aufrufe DESC) - sozusagen als dynamisch generierte Tabelle zum joinen verwendest, ist hier keine Sortierung sinnvoll oder nötig.
    Es wird sowieso ALLES dazugejoint und nachher ja nochmal weiterverarbeitet und sortiert, daher ist die Angabe einer Reihenfolge bei diesem Zwischenergebnis sinnlos und nicht gestattet. Ich glaube das ist dein Denkfehler.

    Eine Sortierung kannst du erst bei der Ausgabe machen, d.h. da wo auch ORDER BY T1.BlockID steht.

    1. Viele Dank für deine Antwort!
      Leider geht das so nicht, wie du mir das Gesagt hast, da so im View der falsche Wert bei maxname und maxnameaufrufe stehen kann. Es gibt ja mehrere mögliche Datensätze für die Felder maxname und maxnameaufrufe.
      Später wird dann nur der Wert mit dem kleinsten Index da stehen und das Gesamte View sortiert, was an dieser Stelle nicht mein Ziel ist.

  3. Hallo,

    Du suchst eine korrelierte Unterabfrage.

    Die beiden Tabellen sollen verbunden und in einer View gespeichert werden.
    Verbunden werden können sie mit folgendem SQL Befehl

    SELECT T1.BlockID, T1.comment, T2.name AS maxname, T2.aufrufe AS maxnameaufrufe, SUM(T2.aufrufe) AS gesaufrufe, T1.blocked
    FROM blocklist T1 LEFT JOIN (SELECT * FROM blocklistnames ORDER BY aufrufe DESC) AS T2 ON T1.BlockID = T2.BlockID
    GROUP BY T1.BlockID, T2.BlockID
    ORDER BY T1.BlockID

    Allerdings brauche ich diesen Subquery damit maxname und maxnameaurufe wirklich der eintrag mit den meisten Aufrufen und nicht mit dem kleinsten Index ist.

    Nutze eine korrelierte Unterabfrage.

    Kennt jemand eine andere Methode um die Tabelle vorsortieren zu können?

    Wozu? Um den völlig falschen Ansatz fortzusetzen - mit einer Abfrage, die kein DBMS außer MySQL (im Standardmodus) akzeptiert? Das ist keine gute Idee.

    Freundliche Grüße

    Vinzenz