Tabelle ohne Subquery vor join sortieren
nclaasen
- datenbank
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
Mahlzeit nclaasen,
Ich habe folgendes Problem:
Und Du solltest wissen, dass Doppelpostings hier nicht erwünscht sind.
MfG,
EKKi
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).
Moin EKKi,
Ja, jetzt nicht mehr - da hat wohl einer versehentlich das erste Posting gelöscht anstatt des doppelt geposteten.
Egal, der Hinweis darauf,
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
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.
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.
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 BYaufrufe
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