Hallo,
fall
id
namefall_historie
id
fall_id
fall_beschreibung
zeitpunktNun gebe ich über ein PHP Skript einen zeitpunkt an (nennen wird mal $zeitpunkt ;o) ) und ich hätte gerne eine mySQL Abfrage, die mir den Namen des Falles anzeigt, und die Beschreibung wie sie zuletzt war VOR $zeitpunkt ... Und das dann zudem noch für ALLE Fälle in Fall mit einer DB Abfrage. Geht sowas??
zwar krieg ich _einen_ passenden datensatz mit:
SELECT f.name, h.fall_beschreibung
FROM fall AS f, fall_historie AS h
WHERE f.id = h.fall_id AND $zeitpunkt > h.zeitpunkt
ORDER BY zeitpunkt
LIMIT 0,1`
Das es nur ein Datensatz ist liegt doch nur am LIMIT.
SELECT f.name, h.fall_beschreibung
FROM fall AS f, fall_historie AS h
WHERE f.id = h.fall_id AND $zeitpunkt > h.zeitpunkt
ORDER BY zeitpunkt
Bringt ein Resultset mit _allen_ namen aus fall mit der fall_beschreibung aus fall_historie, für die es einen Eintrag in fall_historie gibt, dessen zeitpunkt < $zeitpunkt ist, sortiert nach zeitpunkt. Dadurch, durch die Sortierung, können die Fälle natürlich durcheinander geraten, also nicht aufeinander folgend stehen. Eventuell solltest Du hauptsächlich nach h.fall_id und nur innerhalb gleicher ids nach zeitpunkt sortieren.
...
ORDER BY h.fall_id, zeitpunkt
2 Sachen wo ich nicht wirklich durchblicke sind LEFT JOIN und der Unterschied zwischen HAVING und WHERE ... Falls mir eins von den 2 hier helfen sollte, wär ich froh um ne kleine Erklärung, warum sie das tun, was sie tun ;)
Das, was Du da machst, ist ein INNER JOIN. Man könnte diesen auch so formulieren:
SELECT f.name, h.fall_beschreibung
FROM fall AS f INNER JOIN fall_historie AS h ON f.id = h.fall_id WHERE $zeitpunkt > h.zeitpunkt
ORDER BY zeitpunkt
Ein LEFT JOIN:
SELECT f.name, h.fall_beschreibung
FROM fall AS f LEFT JOIN fall_historie AS h ON f.id = h.fall_id
würde alle Datensätze der links (LEFT) stehenden Tabelle, also fall, einbeziehen, auch, wenn für diese kein Eintrag mit fall_id in der Tabelle fall_historie steht. Das Feld fall_beschreibung hätte dann den Wert NULL.
Wenn das gewünscht wäre, könnte natürlich nicht einfach
SELECT f.name, h.fall_beschreibung
FROM fall AS f LEFT JOIN fall_historie AS h ON f.id = h.fall_id
WHERE $zeitpunkt > h.zeitpunkt
geschrieben werden, weil natürlich, bei den zum INNER JOIN zusätzlichen Datensätzen, auch h.zeitpunkt den Wert NULL hätte. Da dieser die Bedingung $zeitpunkt > h.zeitpunkt nicht erfüllt, würde das WHERE diese Datensätze geich wieder eliminieren. Man müsste also
SELECT f.name, h.fall_beschreibung
FROM fall AS f LEFT JOIN fall_historie AS h ON f.id = h.fall_id
WHERE $zeitpunkt > h.zeitpunkt OR h.zeitpunkt IS NULL
schreiben. Die Syntax der Prüfung auf NULL ist abhängig vom SQL Dialekt.
HAVING wird, statt WHERE, verwendet, um Bedingungen für gruppierte Recordsets zu formulieren. Du brauchst es also nur, wenn GROUP BY verwendet wird.
viele Grüße
Axel