Kalle_B: MySQL Möchte die 1. Zeile einer Gruppe

Hallöle,

eine Tabelle "termine" ist über eine ort_id mit der Tabelle "orte" verknüpft.

Nun suche ich alle Orte, die mindestens einen Termin haben:

ort       termine
--------- ------------
Hamburg   01.04.08
Hamburg   10.04.08
Hamburg   20.04.08
München   05.04.08

Wie kann ich erreichen, dass mir die jeweils 1. Zeile für den Ort zur Verfügung steht? Mit GROUP BY ort kann ich ja nicht mehr auf die Felder von "termine" zugreifen.

Im Moment lese ich innerhalb der while-Schleife für jeden gefundenen Ort den ersten Termin. Das muss doch eleganter gehen.

Lieben Gruß, Kalle

  1. Hallo Kalle,

    Nun suche ich alle Orte, die mindestens einen Termin haben:

    ort       termine


    Hamburg   01.04.08
    Hamburg   10.04.08
    Hamburg   20.04.08
    München   05.04.08

    Wie kann ich erreichen, dass mir die jeweils 1. Zeile für den Ort zur Verfügung steht? Mit GROUP BY ort kann ich ja nicht mehr auf die Felder von "termine" zugreifen.

    diese Standardaufgabe löst Du mit einer korrelierten Unterabfrage. Eine kleine Archivsuche nach Postings von Ilja, Rouven, mir oder anderen zu dem Thema sollte ergiebig sein und zum Beispiel dieses Archivposting von mir zu Tage fördern.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      danke dir, meine gestellte Frage konnte ich mit deinem Beispiel lösen:

      SELECT
       ter1.ort_id
      ,ter1.tag
      ,ter1.uhr
      ,ter1.titel
      ,ort1.plz
      ,ort1.name
      FROM     bia_termine AS ter1
              ,bia_orte    AS ort1
      WHERE    ter1.owner_id=1
      AND      ter1.intern_kz=0
      AND      concat(ter1.tag, ter1.uhr) = ( SELECT min(concat(ter2.tag, ter2.uhr)) FROM bia_termine AS ter2 WHERE ter2.ort_id = ter1.ort_id )
      AND      ort1.id = ter1.ort_id

      ORDER BY ort1.plz, ort1.name

      Zusatzfrage:

      Wie kann ich einbauen, dass noch die Gesamtzahl der Termine pro Ort ausgegeben wird? Wohin muss der count() ?

      MfG Kalle

      1. yo,

        1. Tipp

        gibt es einen besonderen grund, warum du in der tabelle termin, den tag und die zeit aufgeteilt hast, anstelle wir meistens sinnvoller einfach nur ein attribut mit datum und zeit zu nehmen ?

        2. Tipp

        benutze explizite JOIN syntax, die schreibweise die du benutzt, ist kaffee von gestern und liest sich um ein vielfaches schlechter.

        3. Tipp

        ersparr dir die AS Kauseln bei aliasnamen der tabellen.

        FROM     bia_termine ter1
        INNER JOIN bia_orte ort1 ON ort1.id = ter1.ort_id

        Wie kann ich einbauen, dass noch die Gesamtzahl der Termine pro Ort ausgegeben wird? Wohin muss der count() ?

        der count muss in eine weitere unterabfrage in die SELECT Klausel.

        SELECT
         ter1.ort_id
        ,ter1.tag
        ,ter1.uhr
        ,ter1.titel
        ,ort1.plz
        ,ort1.name,
        (hier_unterabfrage_mit_count_in_klammern) Anzahl
        FROM .....

        Ilja

  2. Hi,

    Wie kann ich erreichen, dass mir die jeweils 1. Zeile für den Ort zur Verfügung steht? Mit GROUP BY ort kann ich ja nicht mehr auf die Felder von "termine" zugreifen.

    Ist die erste Zeile die mit dem "kleinesten" Termin? Dann müsste dir min() weiterhelfen, wenn mich nicht alles täuscht.

    mfG,
    steckl

    1. Hi,

      Ist die erste Zeile die mit dem "kleinesten" Termin? Dann müsste dir min() weiterhelfen, wenn mich nicht alles täuscht.

      Ja, es ist der kleinste Termin, aber ich brauche weitere Angaben zu diesem Termin wie z.B. Thema.

      MfG Kalle