verona: MySQL SELECT LEFT JOIN oder WHERE

Hallo liebe Forumteilnehmer,

ich bin's mal wieder mit 'nem Problem.

Wie man den Tabellen entnehmen kann, nimmt Kunde (1) Hans an zwei Seminaren teil. Ich möchte aber nur jeweils die ersten Seminare angezeigt bekommen. In diesem Fall das Seminar 2003-01-20.

seminartermin
+-----------+------------+------------+
| termin_id |   beginn   | teilnehmer |
+-----------+------------+------------+
|         1 | 2003-01-20 |          15|
|         2 | 2003-01-27 |          15|
+-----------+------------+------------+

kunde
+-----------+---------+------------+
|  kunde_id | vorname |  nachname  |
+-----------+---------+------------+
|         1 |    hans | mustermann |
|         2 |  dieter |   beispiel |
+-----------+---------+------------+

seminarbelegung
+-------------+-----------+-----------+
| belegung_id |  kunde_id | termin_id |
+-------------+-----------+-----------+
|           1 |         1 |         1 |
|           2 |         1 |         2 |
|           3 |         2 |         2 |
+-------------+-----------+-----------+

Ich habe folgende Abfrage benutzt und bekomme natürlich doppelte Kundenanzeigen.

SELECT *
FROM kunde AS k
LEFT JOIN seminarbelegung AS sb ON sb.kunden_id = k.kunde_id
LEFT JOIN seminartermin AS st ON sb.termin_id = st.termin_id

+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+
|  kunde_id | vorname |  nachname  | belegung_id |  kunde_id | termin_id | termin_id |   beginn   | teilnehmer |
+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+
|         1 |    hans | mustermann |           1 |         1 |         1 |         1 | 2003-01-20 |          15|
|         1 |    hans | mustermann |           2 |         1 |         2 |         2 | 2003-01-27 |          15|
|         2 |  dieter |   beispiel |           3 |         2 |         2 |         2 | 2003-01-27 |          15|
+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+

Das unten hätte ich aber gebraucht:

Ich weiß nicht, wie ich eine Bedingung basteln soll, oder ob ich besser mit MIN() bzw. MAX() arbeiten soll.

+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+
|  kunde_id | vorname |  nachname  | belegung_id |  kunde_id | termin_id | termin_id |   beginn   | teilnehmer |
+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+
|         1 |    hans | mustermann |           1 |         1 |         1 |         1 | 2003-01-20 |          15|
|         2 |  dieter |   beispiel |           3 |         2 |         2 |         2 | 2003-01-27 |          15|
+-----------+---------+------------+-------------+-----------+-----------+-----------+------------+------------+

Auch wären die ganzen ..._id Felder eigentlich nicht nötig. Gibt es eine Möglichkeit beim LEFT JOIN nur ausgewählte Spalten zu übernehmen? Oder könnte ich das Ganze mit WHERE-Bedingungen auch machen? Wichtig ist mir nur, dass ich auch andere Tabellen, z.B. Adresse, auch anbinden kann.

Gruß V.

  1. Hallo!

    SELECT *
    FROM kunde AS k
    LEFT JOIN seminarbelegung AS sb ON sb.kunden_id = k.kunde_id
    LEFT JOIN seminartermin AS st ON sb.termin_id = st.termin_id

    Ich weiß nicht, wie ich eine Bedingung basteln soll, oder ob ich besser mit MIN() bzw. MAX() arbeiten soll.

    Genau, MIN() ist Dein Freund. Verwende ein GROUP BY über die Spalte k.kunden_id, und MIN(sb.termin_id), so gruppierst Du die Daten nach Kunden - hast also nur einen Datensatz pro Kunden, und mit der GROUP BY Funktion MIN() kannst Du dann bei "SELECT MIN(sb.termin_id) AS termin,..." die kleinste ID der der jeweiligen zugewiesenen Termine ermitteln.

    Auch wären die ganzen ..._id Felder eigentlich nicht nötig. Gibt es eine Möglichkeit beim LEFT JOIN nur ausgewählte Spalten zu übernehmen? Oder könnte ich das Ganze mit WHERE-Bedingungen auch machen? Wichtig ist mir nur, dass ich auch andere Tabellen, z.B. Adresse, auch anbinden kann.

    Wenn Du mehrere Tabellen hast brauchst Du den JOIN. WHERE bringt hier nicht sonderlich viel.

    Wie Du bei SELECT an ausgwählte Spalten kommt solltest Du wissen!
    http://de.mysql.com/documentation/mysql/bychapter/manual.de_Tutorial.html#Selecting_columns
    http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#JOIN
    http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#Group_by_functions

    Viele Grüße
    Andreas

    1. Hallo Andreas,

      das sind dann ja zwei selects, oder? Also erst mein select und danach dann das mit min()? Alles in einem geht nicht?

      1. HI!

        das sind dann ja zwei selects, oder? Also erst mein select und danach dann das mit min()? Alles in einem geht nicht?

        eine reicht, sowas wie

        select min(spalte2), count(spalte4) from tabelle1 left join tabelle2 on bla=bla group by spalte5

        Lese mal die Links die ich dir geschickt habe, oder für den Anfang auch mal:

        http://www.php-faq.de/q/q-sql-aggregation.html
        http://www.php-faq.de/ch/ch-databases.html

        Viele Grüße
        Andreas