Interessanter Artikel.
Habe meine DB-Struktur mal in folgendes umgebaut:
Tabelle 1 (flights):
flightID day_start starttime endtime departure arrival aircraft
Tabelle 2 (crewactions):
flightID crewmember
Mit folgender Abfrage bekomme ich alle Mitarbeiter und deren jeweilige Flüge:
[highlight=sql]
SELECT DISTINCT
b.cm
a.fid,
a.day_start,
a.start,
a.end,
a.dep,
a.arr
FROM flights a
INNER JOIN crewactions b ON a.fid = b.fid
INNER JOIN crewactions c ON b.fid = c.fid
WHERE
(
b.cm =
(
SELECT b.cm
FROM crewactions as b
WHERE c.cm = b.cm
AND b.fid = a.fid
)
)
ORDER BY b.cm, a.day_start, a.start
[/highlight]
Über crewactions fid und cm habe ich einen Index angelegt, der auch verwendet wird.
Überraschender Weise läuft diese Abfrage ziemlich schnell ab. Bin mir allerdings nicht so ganz sicher, ob ich das auch komplett verstanden habe, was ich da geschrieben habe. Kann man das noch verbessern ?
Und jetzt probiere ich schon seit zwei Tagen, aus diesem Ergebnis eben, wie oben schon diskutiert, pro Mitarbeiter immer die erste Startzeit des Tages, die letzte Ankunftszeit des Tages, den ersten Abflughafen und den letzten Ankunftsflughafen aufzulisten. Wie das grundsätzlich ginge, habe ich schon verstanden, ich weiß nur nicht, wie ich diese beiden Abfragen nun miteinander verbinden muss.
Hier nochmal die Abfrage, die ich für letzteres Problem nutze:
[highlight=sql]
SELECT
a.date as date,
a.start AS start,
b.end AS end,
a.dep AS dep,
b.arr AS arr,
a.reg AS reg,
addtime(
timediff(b.end,a.start),
addtime(
if((a.dep = 'TXL'),'01:15:00','01:00:00'),
if((b.arr = 'TXL'),'00:45:00','00:30:00')))
AS dutytime
FROM flights_per_cm a
JOIN flights_per_cm b
WHERE
(
(
a.start =
(
SELECT MIN(b.start)
FROM flights_per_cm b
WHERE b.date = a.date
)
)
AND
(
b.end =
(
SELECT MAX(b.end)
FROM flights_per_cm b
WHERE b.date = a.date
)
)
)
[/highlight]
Ich dachte ja, ich könnte in unterer Abfrage flights_per_cm einfach durch die obere Abfrage ersetzten,
das klappt allerdings irgendwie nicht.
Habe meine DB-Struktur mal in folgendes umgebaut:
Tabelle 1 (flights):
flightID day_start starttime endtime departure arrival aircraft
Tabelle 2 (crewactions):
flightID crewmember
Mit folgender Abfrage bekomme ich alle Mitarbeiter und deren jeweilige Flüge:
[highlight=sql]
SELECT DISTINCT
b.cm
a.fid,
a.day_start,
a.start,
a.end,
a.dep,
a.arr
FROM flights a
INNER JOIN crewactions b ON a.fid = b.fid
INNER JOIN crewactions c ON b.fid = c.fid
WHERE
(
b.cm =
(
SELECT b.cm
FROM crewactions as b
WHERE c.cm = b.cm
AND b.fid = a.fid
)
)
ORDER BY b.cm, a.day_start, a.start
[/highlight]
Über crewactions fid und cm habe ich einen Index angelegt, der auch verwendet wird.
Überraschender Weise läuft diese Abfrage ziemlich schnell ab. Bin mir allerdings nicht so ganz sicher, ob ich das auch komplett verstanden habe, was ich da geschrieben habe. Kann man das noch verbessern ?
Und jetzt probiere ich schon seit zwei Tagen, aus diesem Ergebnis eben, wie oben schon diskutiert, pro Mitarbeiter immer die erste Startzeit des Tages, die letzte Ankunftszeit des Tages, den ersten Abflughafen und den letzten Ankunftsflughafen aufzulisten. Wie das grundsätzlich ginge, habe ich schon verstanden, ich weiß nur nicht, wie ich diese beiden Abfragen nun miteinander verbinden muss.
Hier nochmal die Abfrage, die ich für letzteres Problem nutze:
[highlight=sql]
SELECT
a.date as date,
a.start AS start,
b.end AS end,
a.dep AS dep,
b.arr AS arr,
a.reg AS reg,
addtime(
timediff(b.end,a.start),
addtime(
if((a.dep = 'TXL'),'01:15:00','01:00:00'),
if((b.arr = 'TXL'),'00:45:00','00:30:00')))
AS dutytime
FROM flights_per_cm a
JOIN flights_per_cm b
WHERE
(
(
a.start =
(
SELECT MIN(b.start)
FROM flights_per_cm b
WHERE b.date = a.date
)
)
AND
(
b.end =
(
SELECT MAX(b.end)
FROM flights_per_cm b
WHERE b.date = a.date
)
)
)
[/highlight]
Ich dachte ja, ich könnte in unterer Abfrage flights_per_cm einfach durch die obere Abfrage ersetzten,
das klappt allerdings irgendwie nicht.
Comment