Position eines Datensatzes im Ergebnis

Kalito

Erfahrenes Mitglied
Hallo

ich arbeite gerade an einer Schulungsanmeldefunktion und hänge an einer Auswertung. Ich habe eine tabelle Slots. Die hat einen Tag, start- und endzeitpunkt, sowie eine Schulungswochenende-ID. Zudem habe ich eine Schulungstabelle, in der ich die ID des Startslots und die Anzahl der Slots speichere (natürlich auch viel mehr). Über eine andere Abfrage habe ich die den entsprechenden Datensatz der Schulungstabelle ausgelesen und versuche jetzt anhand der Slots die Anzahl der Stunden für diese Schulung zu berechnen.

Meine bisherige IDEE:
Code:
SELECT * 
FROM  `slots` 
WHERE day_id =1
ORDER BY  `tag` ASC ,  `start` ASC 
LIMIT [start_slot], [slot_laenge]

Wie kann ich anhand der Slot_id die Position des Datensatzes in der Ergebnismenge ermitteln. Ich kann nicht von einer Reihenfolge der ID ausgehen, da sie ja wegen der Sortierung nach Tag und Startzeit ungeordnet sein können.

Oder gibt es eine einfachere Möglichkeit die Stunden zu berechnen

Gruß, Kalito
 
Hallo mit folgender Abfrage
Code:
SELECT * 
FROM  `slots` 
WHERE day_id =1
ORDER BY  `tag` ASC ,  `start` ASC

bekomme ich folgendes Zwischenergebnis

Code:
id  | tag            | start       | ende      | day_id
22 | 2013-01-22 | 09:00:00 | 12:00:00 | 1
12 | 2013-01-22 | 14:00:00 | 18:00:00 | 1
55 | 2013-01-23 | 09:00:00 | 10:00:00 | 1

Auf meine Schulungstabelle habe ich folgende Abfrage:
Code:
SELECT * 
FROM trainings
WHERE id = 17

Daraus bekomme ich folgende Tabelle (Auschnitt)
Code:
id  | start_slot | slot_laenge 
17 | 12           | 2

Das heißt die Schulung beginnt im 2 Slot (22.1.2013 14.00h) und läuft im 2. und 3. Slot. Jetzt muss ich irgendwie ermitteln, das die die Schulung eine Dauer von 5h aufweist.

Gruß
 
Ist nicht ganz einfach. Aber es geht

SQL:
SELECT
	TIME(SUM(diff)) AS total_time
FROM
	(
		SELECT
			--
			@pos := @pos + 1 AS pos,
			s.*,
			TIMEDIFF(s.ende, s.start) AS diff
		FROM
			(SELECT @pos := 0 ) AS vars,
			slots AS s
		ORDER BY
			s.tag, 
			s.start
	) AS dat,
	-- das folgende Subquery generiert einen Einzeiler mit allen notwendigen Informationen
	(
		SELECT 
			-- mit GROUP_CONCAT() alle ids in der korrekten Reihenfolge zu einer Liste zusammenfügen
			@id_list := (SELECT GROUP_CONCAT(s1.id ORDER BY s1.tag, s1.start SEPARATOR ',') FROM slots AS s1) AS id_list,
			-- Position des ersten Slots bestimmen
			-- Mit FIND_IN_SET() findet sich die Position  der gesuchten Slot-ID.
			@start_pos := FIND_IN_SET( t.start_slot, @id_list) AS start_pos,
			-- Berechnen welche Position der letzte Slot hat
			@end_pos := @start_pos + t.slot_laenge - 1 AS end_pos
		FROM
			trainings AS t
		WHERE
			-- Hier kommt die gesuchte Tainings-ID hin
			id = 17
	) AS sel
WHERE
	dat.pos BETWEEN start_pos AND end_pos

Sieht ein wenig komplex aus, ists aber nicht wirklich.
Es sind 2 Subqueries da. Im ersten sortiere ich die slots und numeriere sie soweit durch, damit jeder Slot eine Positionsnummer hat (pos).
Das 2te Query ist komplexer. Am Ende gibt dieses Query genau eine Zeile aus mit den Informationen über die Start-Position und die End-Position.
Mit diesen Zwei Informationen gehe ich auf das erste Query los und grenze damit die Daten ein.
 
Zuletzt bearbeitet von einem Moderator:
Hallo, damit bekomme ich aber nur eine Zeit von 4 Stunden und nicht 5 Stunden. Anscheinend nimmst du nur die Zeit, des start_slot. Die Schulung geht aber über 2 Slots und von daher müssen es insgesamt 5 Stunden sein.
 

Neue Beiträge

Zurück