Ich habe diese Abfrage ( SQLFiddle ):
SELECT
c.name,
a.user_id,
a.status_id,
a.title,
a.rtime,
u.user_name,
s.status_name
FROM company c
LEFT JOIN action a ON a.company_id=c.id
LEFT JOIN user u ON u.id=a.user_id
LEFT JOIN status s ON s.id=a.status_id
WHERE u.user_name='Morgan'
-- WHERE c.name='Fiddle'
GROUP BY c.id
HAVING a.rtime IS NULL OR a.rtime = (
SELECT max(rtime)
FROM action a2
WHERE deleted IS NULL
AND a2.company_id = c.id
)
Problem 1
Ich möchte alle Unternehmen auflisten und dem Benutzer und dem Status anzeigen, wo sie zuletzt eine Aktion für das Unternehmen ausgeführt haben. Zeigen Sie gleichzeitig den Unternehmen, wo keine Maßnahmen ergriffen wurden.
Problem 2
Ich muss auch in der Lage sein, den Benutzer anhand seines Namens zu suchen und dabei alle Unternehmen auszuwählen, bei denen dieser Benutzer die letzte Aktivität hatte. Die Abfrage erfolgt aus einem Formular, sodass ich Variablen einfügen kann.
Ich bin derzeit nicht in der Lage, die Datenbank SCHEMA zu ändern, aber Ratschläge für eine zukünftige Migration werden sehr geschätzt.
Ich habe versucht, es zusammenzubinden, INNER JOIN ( SELECT.. ) t ON
aber ich kann es nicht verstehen.
Ich habe auch Methoden von hier , hier und hier ausprobiert , aber ich kann die Person mit der neuesten Aktivität nicht richtig finden.
MySQL-Version: 5.5.16. Die Firmentabelle hat ungefähr 1 Million Zeilen, und die Aktionstabelle ist bei 70.000 und wächst. Leistung ist mir hier wichtig.
Wie kann das gelöst werden?
MAX(Marks)
perTaskID
möchten SieMAX(ActivityDate)
perCompany
.) Es gibt keinen großen Unterschied, ob Sie eine Tabelle oder einen Join haben.Antworten:
Ihre Anfrage kann vereinfacht werden zu:
Ein Index auf
(deleted, company_id, rtime)
würde die abgeleitete Tabellenunterabfrage effizient machen. Ich nehme an, Sie haben bereits Indizes für die Spalten, die für die Joins verwendet werden, und für dieCompany (name)
.SQL-Geige
quelle
Nachdem ich die verschiedenen Antworten ausprobiert hatte, funktionierte es, aber ich fand es langsam in meinem Setup.
ypercube hat mich auf eine Antwort hingewiesen, die auf andere ähnliche Fragen zur Gruppierung der Ergebnisse durch MySQL verweist. Dies führte mich zu dieser Ressource, wo ich endlich verstand, was los war.
Das Ergebnis ist eine Abfrage wie folgt:
Hier ist eine Geige mit der Arbeitsabfrage
quelle
Sie müssen Benutzer-, Aktions- und Statustabellen wie folgt in eine Unterabfrage verschieben:
SQL Fiddle
quelle