So ermitteln Sie die Anzahl der Zeilen aus mehreren verknüpften Tabellen mit einer AbfrageMySql

MySQL DBMS-Forum
Anonymous
 So ermitteln Sie die Anzahl der Zeilen aus mehreren verknüpften Tabellen mit einer Abfrage

Post by Anonymous »

Tut mir leid, wenn das schon einmal gefragt wurde, aber ich bin hier etwas ratlos.
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`
Allerdings ergibt dies eine lächerlich hohe Zahl, die einem kartesischen Produkt ähnelt (10296 statt 26 + 12 + 11, wie die tatsächlichen Daten für eine bestimmte Zeile wären).

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post