Ich habe vier Tabellen, eine primäre und drei abhängige Tabellen, nennen wir sie A, B, C und D.
Alle Tabellen haben die Spalten-ID, wobei ID der Primärschlüssel für A und der Fremdschlüssel für B-D ist.
B-D haben auch eine Spalte namens Zeitstempel und (nicht eindeutige) Indizes, die ID und Zeitstempel (in dieser Reihenfolge) kombinieren.
Wie erhalte ich für eine bestimmte Teilmenge von IDs aus „A“ die Anzahl der Zeilen in den Tabellen B-D, optional gefiltert nach einem Bereich von Zeitstempeln?
Vorzugsweise ohne Verwendung abhängiger Unterabfragen, da diese (angeblich) „sehr“ sind ineffizient'.
Was ich versucht habe, ist ungefähr so:
Code: Select all
SELECT A.`ID`, (COUNT(`B`.`timestamp`) + COUNT(`C`.`timestamp`) + COUNT(`D`.`timestamp`)) as `eventCount` FROM `A`
LEFT JOIN `B` ON A.`ID` = `B`.`ID`
LEFT JOIN `C` ON A.`ID` = `C`.`ID`
LEFT JOIN `D` ON A.`ID` = `C`.`ID`
GROUP BY A.`ID`
Ich habe über die Verwendung von COUNT(DISTINCT...) nachgedacht, mache mir aber Sorgen, dass dadurch auch doppelte Zeitstempel herausgefiltert werden, was durchaus möglich ist.
Bearbeiten: Das habe ich hinzugefügt ein Spiel, mit dem Sie Ihre Abfragen ausprobieren können.
Außerdem möchte ich anmerken, dass ich tatsächlich nicht über „einen kleinen Datensatz“ verfüge, sondern über mehrere 10.000 Zeilen spreche, weshalb ich mir von Anfang an Sorgen um die Effizienz mache.
Allerdings sollte die Abfrage selbst wenig damit zu tun haben, „wie viele Zeilen“ es gibt.
Mobile version