2017-02-22 2 views
0

Ich habe eine Tabelle, die "Arbeit" für ein bestimmtes "Projekt" enthält und ich möchte die nächste Zeile aus der Tabelle für jedes Projekt abrufen.MySQL GROUP BY nächste Zeile in Tabelle für Fremdschlüssel Einschränkung

TABLE project { id, name } 
TABLE work {id, project_id, value, done} 

Was ist die richtige, performante Abfrage, um neue Arbeit nacheinander zu erhalten, bis alles fertig ist? Die folgende Abfrage funktioniert nicht und das Ersetzen der Auswahlspalten durch min(columnhere) führt zu nicht übereinstimmenden Ergebnissen aus mehreren Zeilen.

SELECT w.id, p.name, w.value FROM work w 
LEFT JOIN project p ON p.id = w.project_id 
GROUP BY project_id 

Ergebnisse aus der obigen Abfrage sollte wie folgt aussehen:

34, "Project 1", "Work 43", "..." 
21, "Project 2", "Work 10", "..." 
321, "Project 3", "Work 86", "..." 
+0

Ist es die gleiche Frage? – GurV

+0

Bitte senden Sie Ihre gewünschte Ergebnistabelle. – r0xette

Antwort

1

Wenn ich Ihre Frage richtig bin zu lesen und Sie müssen ein (noch nicht fertig) für jedes Projekt dann zu einem Zeitpunkt arbeiten, sind die Suche nach so etwas wie diese

SELECT n.id, n.project_id, p.name project, w.value work 
    FROM 
(
    SELECT project_id, MIN(id) id 
    FROM work 
    WHERE done = 0 
    GROUP BY project_id 
) n JOIN work w 
    ON n.id = w.id JOIN project p 
    ON n.project_id = p.id 

Erläuterung:

  1. schnappen Sie sich die allererste ID der Arbeit, die noch nicht pro Projekt erledigt wurde. Die Annahme hier ist, dass die Arbeit nach ID geordnet ist.
  2. kommen zurück zu work alle anderen Arbeitswerte basierend auszukommen id
  3. -projects beitreten Beispiel für eine Ausgabe erhalten Projektnamen:
 
+------+------------+-----------+---------+ 
| id | project_id | project | work | 
+------+------------+-----------+---------+ 
| 43 |   34 | Project 1 | Work 43 | 
| 10 |   21 | Project 2 | Work 10 | 
| 86 |  321 | Project 3 | Work 86 | 
+------+------------+-----------+---------+ 
+0

Schön. Die Abfrage funktioniert, ist aber langsam, es sei denn, Sie fügen einen Index für beide Spalten in der Unterabfrage hinzu: 'index (done, project_id)'. Selbst dann muss MySQL immer noch fast alle Zeilen in der Tabelle sortieren. – Xeoncross

+0

Sicher. Selbstverständlich brauchen Sie entsprechende Indizes. – peterm

+0

Dann, wenn jemand die entsprechenden Indizes herausfinden kann, dann lass es uns wissen. – Xeoncross