Timo: erste Zeile einer Gruppe ausgeben

Hallo,

ich habe folgendes Szenario. Auf einem MS SQL-Server existieren zwei Tabellen

Gallerie mit den Spalten
gal_id gal_titel gal_datum gal_status ...

GallerieImages mit den Spalten
gi_id gi_gal_id gi_image gi_sortorder ...

d.h. in der Tabelle GallerieImages sind eine Reihe von Bildernamen, die jeweils einer Gallerie aus der Tabelle Galleries zugeordnet sind.

Ich möchte jetzt eine Abfrage, welche mir folgendes Ergebnis zurückliefert

gal_id gal_titel gal_datum gi_image

wobei gi_image nur das erste Bild aus der entsprechenden Gallerie ist. Dazu benutze ich momentan ein SQL-Statement ähnlich wie

SELECT     Galleries.gal_id, Galleries.gal_titel, Galleries.gal_datum, GalleriesImages.gi_image
FROM         Galleries INNER JOIN
                      GalleriesImages ON Galleries.gal_id = GalleriesImages.gi_gal_id
WHERE     (Galleries.gal_status = 1)
ORDER BY Galleries.gal_datum, GalleriesImages.gi_sortorder, GalleriesImages.gi_id DESC

wobei die Resultatliste hier aussieht wie

gal_id gal_titel gal_datum gi_image
1  Weihnachten 24.12.07 bild1.jpg
1  Weihnachten 24.12.07 bild2.jpg
1  Weihnachten 24.12.07 bild3.jpg
1  Weihnachten 24.12.07 bild4.jpg
2  Silvester 31.12.07 pic1.gif
2  Silvester 31.12.07 pic2.gif
2  Silvester 31.12.07 pic3.gif

Ich möchte aber nur

gal_id gal_titel gal_datum gi_image
1  Weihnachten 24.12.07 bild1.jpg
2  Silvester 31.12.07 pic1.gif

Hat jemand eine Idee, wie ich mein SQL-Statement so umbauen kann, dass es mir das gewünschte Resultat liefert bzw. ist dies innerhalb eines einzelnen SQL-Statements überhaupt möglich (ich benutzt MS SQL 2000)?

Danke für jeden Hinweis

Timo

  1. Mahlzeit,

    Gallerie mit den Spalten
    gal_id gal_titel gal_datum gal_status ...

    GallerieImages mit den Spalten
    gi_id gi_gal_id gi_image gi_sortorder ...

    <überleg mode="grübel">
    Wieso kennt eigentlich kaum ein 1337-H4X0r das deutsche Wort "Galerie"?
    </überleg>

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hallo

    Ich möchte jetzt eine Abfrage, welche mir folgendes Ergebnis zurückliefert

    gal_id gal_titel gal_datum gi_image

    wobei gi_image nur das erste Bild aus der entsprechenden Gallerie ist. Dazu benutze ich momentan ein SQL-Statement ähnlich wie

    gal_id gal_titel gal_datum gi_image
    1  Weihnachten 24.12.07 bild1.jpg
    2  Silvester 31.12.07 pic1.gif

    wie üblich geht dies mit einer korrelierten Unterabfrage, siehe auch dieses Archivposting:

      
    SELECT                                 -- Gib mir  
        g.gal_id,                          -- die ID der Galerie,  
        g.gal_titel,                       -- ihren Titel  
        g.gal_datum,                       -- ihr Datum  
        gi.gi_image                        -- und ein Bild  
    FROM  
        galerie g                          -- aus jeder Galerie  
    INNER JOIN  
        galerieimages gi                   -- und den zugehörigen Bildern  
    ON  
        g.gal_id = gi.gi_gal_id  
    /*  
        Beachte:  
        Da Du in der Unterabfrage auf die gleiche Tabelle zugreifst und diese  
        über die WHERE-Klausel mit der äußeren Tabelle verknüpfst, was man eben  
        als korrelierte Unterabfrage bezeichnet, musst Du unbedingt Aliasnamen  
        für die Tabelle galerieimages verwenden.  
    */  
    WHERE                                  -- wobei ich nur das Bild haben möchte,  
        gi.gi_sortorder = (                -- dessen Sortierungswert den  
            SELECT  
                MIN(gi2.gi_sortorder)      -- kleinsten Wert  
            FROM  
                galerieimages gi2          -- innerhalb der Galerien hat.  
            WHERE  
                gi2.gi_gal_id = gi.gi_gal_id  
        )  
    
    

    Ich habe es nicht übers Herz gebracht, Galerie mit zwei L zu schreiben, da
    kommt mir nämlich die Galle hoch - und das mag ich überhaupt nicht.
    MS SQL Server 2000 unterstützt Subqueries, da brauchst Du Dir keine Gedanken
    zu machen.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      wie üblich geht dies mit einer korrelierten Unterabfrage, siehe
      auch dieses
      Archivposting
      :

      danke vielmals für deine Arbeit und die ausführliche Aufschlüsselung. Die Alias-Benennung war der Hinweis, den ich gebraucht habe.

      und bei der Benennung meiner Datenbanktabellen gelobe ich Besserung O:-)

      Viele Grüße

      Timo