Mysql inner Join und group by

swamp1001

Mitglied
Guten Morgen,

ich habe folgende Datenbanken
1. mf_angebote
id,titel,preis,aktiv

2. mf_termine
id,beginn,ende,gruppe,angebot_id

folgenden Ansatz habe ich:
SELECT * FROM mf_angebote INNER JOIN mf_termine on mf_angebote.id = mf_termine.angebot_id where mf_angebote.aktiv = '1' group by mf_termine.gruppe

Zur Erklärung:
mf_termine enthält alle Termine zu den Angeboten.
Die gruppe in mf_termine hat immer den gleichen Code wenn die Termine zu einer Einheit gehören.
Beispiel:

id,beginn ,ende ,angebot_id,gruppe
1 ,2014-07-30 20:00:00 ,2014-07-30 21:00:00 ,11 ,1111
2 ,2014-07-29 18:00:00 ,2014-07-29 19:00:00 ,11 ,1111
3 ,2014-07-26 19:00:00 ,2014-07-26 22:00:00 ,12 ,3333
4 ,2014-08-15 19:00:00 ,2014-08-15 22:00:00 ,13 ,4444
5 ,2014-08-30 19:00:00 ,2014-08-30 22:00:00 ,13 ,4444

Bei meinem Ansatz bekomme ich jetzt alle Angebote doppelt angezeigt wo auch mehrere Termine vorhanden sind,obwohl die gruppe gleich ist, das angebot darf aber nur einmal angezeigt werden.

Ich brauche die mf_termine um eine suche in einem bestimmten Zeitraum von Angeboten zu machen.

Bitte könnt ihr mir helfen.

Gruss
Swamp
 
Du hast ein GROUP BY und ein SELECT *.
MySQL akzeptiert leider diesen groben Verstoss gegen die Syntax.
MySQL geht einfach davon aus, dass du nach allen Feldern Gruppieren willst. So auch nach der id.

Also, im SELECT Teil nur die Felder nehmen, die Gruppiert werden (also auch im GROUP BY vorhanden sind) oder denen du eine Gruppierungsfunktion (SUM, COUNT etc.) zugewiesen hast.
 
Nabend Yaslaw,

vielen Danke für deine Antwort.
Funktioniert so leider nicht ich habe es jetzt so probiert:
SELECT mf_termine.gruppe, titel, preis FROM mf_angebote INNER JOIN mf_termine on mf_angebote.id = mf_termine.angebot_id where mf_angebote.aktiv = '1' group by mf_termine.gruppe

oder auch so:
SELECT gruppe, titel, preis FROM mf_angebote INNER JOIN mf_termine on mf_angebote.id = mf_termine.angebot_id where mf_angebote.aktiv = '1' group by mf_termine.gruppe

oder auch noch so
SELECT mf_termine.gruppe, mf_angebote.titel, mf_angebote.preis FROM mf_angebote INNER JOIN mf_termine on mf_angebote.id = mf_termine.angebot_id where mf_angebote.aktiv = '1' group by mf_termine.gruppe

ich bekomme da immer noch die Angebote doppelt, bei dennen es mehrere Einheit mit der gleich Gruppe gibt.

Hast du vielleicht noch eine Idee?

Gruss
Swamp
 
Guten Morgen,

geht so leider nicht, da ich dann die anderen Felder aus mf_angebote nicht bekomme.
Ich habe es auch mal probiert nur mit gruppe, da bekomme ich auch immer noch die Einheiten doppelt.
Er darf nur aus mf_termine gruppieren aus mf_angebote brauche ich alle Felder.
 
Nochmals. Ein GROUP BY macht immer eine Gruppierung über alle Felder die nicht mit einer Gruppenfunktioen (SUM, COUNT, MAX etc) behandelt werden. Scheiss egal, ob du nur eines angibst oder mehrere. Und wenn da 2 verschieden Preise vorhanden sind, dann gibts auch 2 Zeilen draus, weil auch nach dem Preis gruppiert wird.
Du kannst auf den Durchschnittspreis, oder den Maximalpreis ermitteln. Aber solange du nichts derartiges machst wird darauf gruppiert. Ende aus.
MySQL ist LEIDER! so freundlich und macht das einfach so. Bei jeder anderen DBMS würde dein SQL auf ein Fehler laufen, weil die DBMS nicht wüsste was es mit den Felder titel und preis machen soll. Darum ist die Syntaxfreundlcihkeit von MySQL schrott, da sie einem nicht auf diese Problematik aufmerksam macht.

Geh nochmals über die Bücher was ein GROUP BY wirklich macht.
 
Zurück