Datenbank auslesen mit GROUP BY - funktioniert nicht

stega

Erfahrenes Mitglied
Hallo,

ich nutze eine MySQL-DB mit mehreren Tabellen für ein Projekt.

Jetzt habe ich eine Tabelle (tl_meet), in der die Verknüpfung verschiedener Tabellen steht (in tl stehen Kursangebote, die mittels tl_id eingebunden werden, in user stehen die Userdaten, die mittels user_id bzw. tutor_id eingebunden werden).

Jetzt möchte ich für die Verwaltung eine Übersicht erstellen, die mir aus der Tabelle alle Tutoren ausliest.

Bsp:

tutor_id - kurs_id
1 - 4
2 - 9
1 - 3
5 - 1

Der Befehl soll jetzt also dann ausgeben:

Tutor:
1
2
5

(mittels INNER JOIN verbinde ich die tutor_id mit der user-Tabelle und lese die Namen dort aus).

Wie kann ich aber diese Auflistung bewerkstelligen? Ich habe es mit DISTINCT versucht, aber da kommt nur eine Fehlermeldung, dass MySQL diesen Befehl nicht kann (/komischerweise). Dann hab ich es mit GROUP BY tutor_id versucht, aber da zeigt er mir komisches Zeugz an.

Mein Befehl lautet aktuell:
PHP:
$query = "SELECT * FROM ks_tl_meet
                    INNER JOIN ks_user ON ks_tl_meet.tutor_id = ks_user.pid  
                    INNER JOIN ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
                                     
                   WHERE ks_tl_meet.tutor_gehalt = '1'
                   AND ks_tl.time < ".$akt_datum."
                   
                   GROUP BY ks_tl_meet.tutor_id, ks_user.username 
                   ";

Die WHERE-Sache bedeutet, dass er nur solche EInträge zusammenfassen darf, die bereits mit ner 1 bei tutor_gehalt markiert sind und die zudem in der Vergangenheit liegen.

Könnt ihr mir sagen, wie ich die Zusammenfassung bewerkstelligen kann?

Vielen Dank für eure Hilfe!

liebe Grüße
 
Hallo stega

Versuch mal, den * zu ersetzen durch die Spalten, die du wirklich willst

SELECT ks_tl_meet.tutor_id, ks_user.username FROM ks_tl_meet .....

Sonst kann die Abfrage gar nicht gruppiert werden, da die DB ja nicht weiss, welchen Wert sie in Spalten füllen soll, in dem unterschiedliche Werte stehen.
In deinem Beispiel gibts ne Kollision mit den Kurs-IDs:
soll die DB nun die 3 oder die 4 einsetzen, wenn nach tutor_id gruppiert wird?

Grüsse, Tecla
 
danke für deine schnelle Hilfe tecla!

wenn ich das jetzt so mache, wie du es gesagt hast, dann erscheint zwar ein Tutor, aber eben auch nur einer und kein weiterer in der Auflistung.

Ausschnitt meiner Tabelle @ DB:

tutor_id - tl_id
2 - 5
7 - 2

Wenn ich jetzt den Befehl:

PHP:
$query = "SELECT ks_tl_meet.tutor_id, ks_user.username FROM ks_tl_meet
                    INNER JOIN ks_user ON ks_tl_meet.tutor_id = ks_user.pid  
                    INNER JOIN ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
                                     
                   WHERE ks_tl_meet.tutor_gehalt = '1'
                   AND ks_tl.time < ".$akt_datum."
                   
                   GROUP BY ks_tl_meet.tutor_id, ks_user.username 
                   ";

laufen lasse, dann zeigt er mit nur den Tutor mit der id 2 an :(

warum?
 
Hallo stega,

dein erwartetes Ergebnis setzt voraus, das es in den Tabellen "ks_user" und "ks_tl" mindestens einen Datensatz mit der "tutor_id" existiert und die Where-Bedingung mit den beiden Einschränkungen auch noch zutrifft.

Ist das der Fall?

Ansonsten poste doch mal Beispieldaten aus deinen 3 Tabellen.
 
hi Bernd1984,

ja, es existiert ein tutor mit der id, die in ks_tl_meet verlinkt ist (eben hier im Bsp. jetzt mit id 2 und id 7.

Und ja, es existiert auch in ks_tl ein Eintrag mit der id, die verlinkt wurde. Und beide treffen auf die WHERE-Bedingung zu, sprich in ks_tl_meet steht bei tutor_gehalt ne 1 und der time-Eintrag liegt in der Vergangenheit.

Hier mal ein Screenshot der Tabellen:

ks_tl: //entfernt
ks_tl_meet: //entfernt
ks_user: //entfernt

wo hab ich denn bloß meinen dummen Fehler?

Ich dachte jetzt schon, dass ichvllt als Alternative einfach nur die tutor_id's auslese (mit GROUP BY?) und dann erst im zweiten Schritt in einer while-Bedingung die Daten aus der Tabelle ks_user suchen könnte anhand der id. Wäre vllt einfacher?
 
Zuletzt bearbeitet:
hallo stega
versuchs doch mal mit ner HAVING-Klausel statt der WHERE-Klausel...
grüsse, tecla
 
Hallo,

dieser SQL (Datum in DB ist '01.01.2009')
Code:
SELECT     ks_tl_meet.tutor_id, ks_user.username
FROM         ks_tl_meet INNER JOIN
                      ks_user ON ks_tl_meet.tutor_id = ks_user.pid INNER JOIN
                      ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
WHERE     (ks_tl_meet.tutor_gehalt = '1') AND (ks_tl.time < '10.02.2009')
GROUP BY ks_tl_meet.tutor_id, ks_user.username
liefert dieses Ergebnis
tutor_id username
3 tutor
7 testtutor
mit deinen geposteten Daten.

Sonst lass dir mal den SQL ausgeben und poste diesen.
 
@Bernd1984: leider funktioniert es bei mir noch immer nicht. Der abkopierte Code lautet:
PHP:
$query = "SELECT  ks_tl_meet.tutor_id, ks_user.username   FROM ks_tl_meet 
                    INNER JOIN  ks_user ON ks_tl_meet.tutor_id = ks_user.pid 
                    INNER JOIN  ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
          WHERE (ks_tl_meet.tutor_gehalt = '1') AND (ks_tl.time < '".$akt_datum."')
          GROUP BY ks_tl_meet.tutor_id, ks_user.username";

ich habe nur da Datum durch den Timestamp ersetzt, den ich hier so erzeuge vorher:

PHP:
$akt_datum = mktime(date(H),date(i),date(s),date(m),date(d),date(Y));

Dann hab ich mir mal den $query ausgeben lassen:
PHP:
SELECT ks_tl_meet.tutor_id, ks_user.username FROM ks_tl_meet 
INNER JOIN ks_user ON ks_tl_meet.tutor_id = ks_user.pid 
INNER JOIN ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id 
WHERE (ks_tl_meet.tutor_gehalt = '1') AND (ks_tl.time < '1239177510') 
GROUP BY ks_tl_meet.tutor_id, ks_user.username

Beim Versuch mit HAVING zu arbeiten habe ich folgenden Code zusammengebastelt:
PHP:
$query = "SELECT  ks_tl_meet.tutor_id, ks_user.username   FROM ks_tl_meet 
                    INNER JOIN  ks_user ON ks_tl_meet.tutor_id = ks_user.pid 
                    INNER JOIN  ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
          WHERE ks_tl_meet.tutor_gehalt = '1'
          GROUP BY ks_tl_meet.tutor_id, ks_user.username
          HAVING ks_tl.time < '".$akt_datum."'";

(im Prinzip also die Zeitprüfung ausgelagert).

Aber da kommt gar nichts bei raus mehr....

ich danke euch schonmal für eure Hilfe!

wo liegt denn nur der Fehler?
 
Hallo stega,

ich hatte für meinen letzten Post die Tabellen mit Daten mal testweise angelegt und den SQL ausgeführt, dabei kam das gewünschte Ergebnis raus.
Das einzige was ich nicht so habe wie du, ist das Feld time.

Hast du schon mal die Bedingung mit dem Datum weggelassen?
Code:
SELECT     ks_tl_meet.tutor_id, ks_user.username
FROM         ks_tl_meet INNER JOIN
                      ks_user ON ks_tl_meet.tutor_id = ks_user.pid INNER JOIN
                      ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
WHERE     (ks_tl_meet.tutor_gehalt = '1')
GROUP BY ks_tl_meet.tutor_id, ks_user.username
Was kommt dann für ein Ergebnis?
 
Es ist echt komisch. Ich hab einfach mal jetzt die time-Bedingung rausgenommen bei mir - und dennoch: er zeigt nur den Tutor mit der id 2 an. Hallo? Was is da bloß los?

mein Code schaut jetzt so aus (also ohne time einfach):

PHP:
$query = "SELECT  ks_tl_meet.tutor_id, ks_user.username  FROM ks_tl_meet 
                    INNER JOIN  ks_user ON ks_tl_meet.tutor_id = ks_user.pid 
                    INNER JOIN  ks_tl ON ks_tl_meet.tl_id = ks_tl.kurs_id
          WHERE (ks_tl_meet.tutor_gehalt = '1')
          GROUP BY ks_tl_meet.tutor_id, ks_user.username
          ";

Hast du denn (mal abgesehen vom aktuellen Code) ne Idee, wie ich mein Vorhaben anders umsetzen könnte? (um diesem ewigen Group by zu entkommen?)

Sprich, man könnte doch irgendwie alle tutor_id's auslesen und dann in einer folgenden while-Schleife dazugehörig die Tutornamen.

Aber - da kommt mir grad, dann müsste man ja wieder auf mehrfahce tutor_id-Einträge testen..... mh. Ne Idee?

Danke für deine Hilfe
 
Zurück