[MySQL] Datumsabfrage (Anfang/Ende) mit JOIN

27apricot

Erfahrenes Mitglied
Hallo,

ich habe heute das erste Mal mit der gleichzeitigen Abfrage zweier Tabellen gearbeitet. Das funktioniert auch erstaunlicherweise alles wunderbar bis auf eine Kleinigkeit.

Folgende Situation: es geht um den Konzertkalender eines Orchesters. Ich habe zwei Tabellen: eine mit Titel, Mitwirkenden und Programm und eine andere in der die Termine stehen. Die Trennung gibt es deshalb, weil ein Programm oft an mehreren Terminen aufgeführt wird.

Neben dem normalen Datum steht nun in der Termin-Tabelle auch noch ein Enddatum, damit auch Konzertreisen eingetragen werden können. Bei einem normalen Konzerttermin sind Anfangs- und Enddatum dann gleich.

Gibt es nun eine Konzerteise beispielsweise von Ende September bis Anfang November, möchte ich, dass diese in allen drei betroffenen Monaten ausgegeben wird. Dafür hab' ich nun folgende MySQL-Abfrage geschrieben (der Monat -- jjjj-mm -- wird dynamisch übergeben):
Code:
SELECT * FROM `tbl_termine`, `tbl_programm`
WHERE
	`tbl_termine`.`id_programm` = `tbl_programm`.`id`
	AND
		(`datum_anfang` LIKE 'jjjj-mm-__' OR `datum_ende` LIKE 'jjjj-mm-__') OR
		(`datum_anfang`<'jjjj-mm-01' AND `datum_ende`>'jjjj-mm-31')
	AND `datum_ende`>=CURDATE()
GROUP BY `id_programm`
ORDER BY `datum_anfang`;

Das ganze hat 100%ig funktioniert, als ich die zwei Tabellen noch getrennt abgefragt habe. Auch jetzt zeigt es mir in allen drei betreffenden Monaten (September/Oktober/November) das Datum der Konzertreise an, aber: im Oktober liest es das falsche Konzert aus der tbl_programm dazu aus.

Das Konzert, dessen Daten es ausliest, ist übrigens das erste, das in der Tabelle stand: mit der niedrigsten ID und auch -- durch Zufall -- mit dem nach dem Alphabet zuerst kommenden Titel. Eine Änderung von beidem hat aber auch nix bewirkt. Es zeigt dann dasselbe Konzert mit den Änderungen an.

Ich bin ratlos und würde mich über Hilfe freuen. Vielen Dank schonmal im Voraus.

EDIT: Wenn ich die zwei eingeklammerten Bedingungen umdrehe, dreht sich auch das Phänomen: es wird nur noch im Oktober das richtige Konzert ausgegeben, in allen anderen Monaten immer nur das erste Konzert zu den richtigen Terminen.

Schöne Grüße:
27apricot.
 
Zuletzt bearbeitet:
Hallo,

hab's jetzt durch rumprobieren doch noch rausgefunden, wenn ich auch zugeben muss, dass ich es nicht 100%ig verstehe, warum es nun so ist, aber es geht jetzt:
Code:
SELECT * FROM `tab_termine`, `tab_programm`
WHERE
	`tab_termine`.`id_programm` = `tab_programm`.`id`
	AND
		(
		`datum_anfang` LIKE 'jjjj-mm-__' OR
		`datum_ende` LIKE 'jjjj-mm-__' OR
		(`datum_anfang`<'jjjj-mm-01' AND `datum_ende`>'jjjj-mm-31')
		)
	AND `datum_ende`>=CURDATE()
GROUP BY `id_programm`
ORDER BY `datum_anfang`;
Es muss also eine Klammer um die gesamte, das Datum betreffende WHERE-Klausel gesetzt werden.

Schöne Grüße:
27apricot
 
Der Grund, dass es jetzt funktioniert, liegt wohl an der Operatorreihenfolge, welche Du mit der Klammerung außer Kraft setzt.

Die Operatorreihenfolge setzt, wie die Punkt-Vor-Strich-Regel in der Mathematik, implizit Klammern.

Beispiele:

2 + 3 * 4 = 2 + (3 *4) = 14
(2 + 3) * 4 = 20

false && false || true = (false && false) || true = true
false && (false || true) = false

Gruß hpvw
 
Hallo hpvw,

Dank dir für den Denkanstoß! Macht ja auch Sinn, wenn man es logisch durchdenkt. Das aber hat vorhin bei mir irgendwie zu keinem Ergebnis geführt ;)

Schönen Gruß:
27apricot
 

Neue Beiträge

Zurück