Ich versuche, eine Liste von Schülern zu erstellen, deren Verhalten in jeder Schuljahresgruppe statistisch gesehen am schlechtesten ist.
Wir haben eine Tabelle namens students
.
Wir haben dann verhalten flags
und alerts
, plus sanctions
.
Unterschiedliche Kategorien von Flagge / Alarm / Sanktion werden jedoch als schwerwiegender eingestuft als andere. Diese werden mit Etiketten in ihrer jeweiligen Tabelle _categories
gespeichert, z. flag_categories
und sanction_categories
. Die Tabelle flag
hat dann eine Spalte namens Category_ID
( alerts
ist ein bisschen anders, da es nur ein Type
-Feld mit 'A', 'C', 'P' und 'S' Werten ist) / p>
Wenn ich Daten betrachten möchte, die unsere Schüler mit der höchsten Punktzahl in einer bestimmten Jahresgruppe zeigen, würde ich diese Abfrage ausführen:
%Vor%Wenn ich unseren Schülern die meisten Krisenwarnungen in einer bestimmten Jahresgruppe zeigen wollte, würde ich diese Abfrage ausführen:
%Vor%Wenn ich herausfinden möchte, wie viele Spät- oder Mobil-Flags ein Student hat, und vielleicht diese zusammen (mit Gewichtungen) hinzufüge, kann ich die folgende Abfrage ausführen:
%Vor%Was ich nicht verstehe, ist, wie ich das über unzählige Tische machen würde. Ich muss gewichten können:
flags
, Category_ID = 10
), Absconded ( flags
, Category_ID = 15
) und Gemeinschaftsflaggen ( flags
, Category_ID = 13
) plus Sicherheitswarnungen ( alerts
, Type = 'S'
) sind alle wert 1 Punkt flags
, Category_ID IN (1, 7, 8)
) sind 2 Punkte wert alerts
, Type = 'P'
) und Haftstrafen ( sanctions
, Category_ID = 1
) sind 3 Punkte wert Also weiter und so fort. Das ist bei weitem keine erschöpfende Liste, aber ich habe genügend Variablen hinzugefügt, die mir helfen, eine multi-table gewichtete Summe zu bekommen.
Das Ergebnis, nach dem ich suche, ist nur zwei Spalten - Name und gewichtete Punkte des Schülers.
Wenn also nach den obigen Punkten ein Student 2 späte Flags (je 1 Punkt) und 1 Prozessalarm (3 Punkte) erhalten hat, sollte die Ausgabe nur Joe Bloggs
und 5
heißen.
Kann mir jemand helfen, zu verstehen, wie ich diese gewichteten Werte aus verschiedenen Tabellen für jeden Schüler in eine SUMM-Ausgabe bringen kann?
[bearbeiten] SQLFiddle hier: Ссылка
Beachten Sie, ich mache das nicht für die Kopfgeld. Bitte gib es jemand anderem.
Dies könnte mit ein paar LEFT JOIN
s von abgeleiteten Tabellen geschehen. Beachten Sie, dass Sie die Sanktionstabelle nicht angegeben haben. Aber das Folgende scheint sehr illustrativ zu sein. Also habe ich eine temporäre Tabelle erstellt. Es scheint maximale Flexibilität zu ermöglichen, ohne einen größeren Links-Join-Begriff zu komplizentieren, der schwer zu debuggen sein könnte. Immerhin haben Sie gesagt, dass Ihre tatsächliche Abfrage viel komplizierter sein wird. Erweitern Sie als solches die temporäre Tabellenstruktur.
Dies lädt eine tmp-Tabelle mit den Standard-Nullen für die Schüler im "Übergabe-Parameter Schülerjahr " an eine gespeicherte Prozedur. Zwei Updates werden durchgeführt. Wählt dann eine Ergebnismenge aus.
Schema / Laden:
%Vor%Gespeicherte Prozedur:
%Vor%Test:
%Vor%Bereinigung:
%Vor%Denken Sie, dass alles, was Sie gefragt haben, mit einer Unterabfrage und einigen Unter-SELECTs erledigt werden kann:
%Vor%Die obige Abfrage enthält alles, was Sie erwähnt haben, abgesehen von Sanktionen (da Ihre ursprüngliche SQL Fiddle-Demo diese Tabelle nicht enthielt).
Eine aktualisierte Geige mit der obigen Abfrage ist hier: Ссылка .
Sie könnten union all
verwendenIm Grunde erstellen Sie alle Ihre individuellen Abfragen für jede Tabelle und verbinden sie alle zusammen mit union all.
Hier ist ein Beispiel, ich habe Ihre Schüler-Tabelle zweimal benutzt, aber Sie würden die zweite zu jeder anderen Tabelle ändern, die Sie wollen. SQLFiddle
Tags und Links mysql