Sie bereiten sich auf ein Datensynchronisierungsproblem vor. Wenn Zeilen in der Leads-Tabelle eingefügt, aktualisiert oder gelöscht werden, müssen Sie die Spalte Employees.LeadCount ständig aktualisieren.
Die beste Lösung wäre, die LeadCount-Spalte überhaupt nicht zu speichern, sondern die Anzahl der Leads mit einer SQL-Aggregatabfrage neu zu berechnen, wenn Sie den Wert benötigen. So wird es immer stimmen.
SELECT employeeID, COUNT(leadId) AS LeadCount
FROM Leads
GROUP BY employeeID;
Die andere Lösung ist Auslöser auf der Leads Tabelle für INSERT, UPDATE und DELETE, zu erstellen, so dass Sie die Employees.LeadCount Spaltenstrom die ganze Zeit halten. Zum Beispiel mit MySQL Trigger Syntax:
CREATE TRIGGER leadIns AFTER INSERT ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END
CREATE TRIGGER leadIns AFTER UPDATE ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END
CREATE TRIGGER leadIns AFTER DELETE ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
END
Eine weitere Option, wenn Sie MySQL verwenden, ist Multi-Table UPDATE Syntax zu verwenden. Dies ist eine MySQL-Erweiterung für SQL, die nicht auf andere RDBMS-Marken übertragbar ist. Setzen Sie zuerst den LeadCount in allen Zeilen auf Null zurück, führen Sie dann einen Join zur Leads-Tabelle aus und erhöhen Sie den LeadCount in jeder vom Join erzeugten Zeile.
sum (employeeID) macht keinen Sinn, und distinct um einen einzelnen Wert wird immer den gleichen Wert zurückgeben, so dass es redundant ist. –
IIRC, das wird wirklich langsam (MySQL ist alles, was ich verwendet habe) – BCS