Ankündigung

Einklappen
Keine Ankündigung bisher.

2 Tabellen, Neuster Datensatz abfragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 2 Tabellen, Neuster Datensatz abfragen

    Hallo zusammen

    Ich habe eine Tabelle "Ordner" und eine Tabelle "Bilder".

    In der Tabelle "Bilder" schreibe ich die neusten Daten bei einem Upload rein.
    Nun möchte ich die Tabelle "Ordner" nach den neusten Einträgen von Bilder ausgeben, sprich den Ordner mit der neusten Datei zuerst, dann den Ordner mit der zweitneusten Datei usw.

    Es darf der Ordner jedoch nur einmal angezeigt werden, genau danach suche ich eine Lösung:

    Ich habe sehr viel ausprobiert, das beste Ergebnis damit:
    PHP-Code:
     $abfrage_gbs "SELECT 
                        *
                    FROM 
                        gallerien_ordner, gallerien_dateien
                    WHERE
                        gallerien_ordner.ordner_2_id = gallerien_dateien.ordner_2_id 
                    GROUP BY
                        gallerien_ordner.ordner_2_id
                    ORDER BY
                        gallerien_dateien.datum DESC"
    ;
    $ausgabe_gbs mysql_query($abfrage_gbs) or die("Fehler in Zeile " __LINE__ " in der Abfrage " $abfrage_gbs ", Fehlermeldung: " mysql_error()); 
    Diese Abfrage gibt mir soweit alle Ordner nur einmal aus, jedoch die Sortierung stimmt nicht.

    Wie muss ich diese Abfrage richtig machen?

    Vielen Dank
    Gruess
    Prinzli

  • #2
    Zitat von prinzli Beitrag anzeigen
    Code:
     $abfrage_gbs = "SELECT 
    					*
    				FROM 
    					gallerien_ordner, gallerien_dateien
    				WHERE
    					gallerien_ordner.ordner_2_id = gallerien_dateien.ordner_2_id 
    				GROUP BY
    					gallerien_ordner.ordner_2_id
    				ORDER BY
    					gallerien_dateien.datum DESC";
    $ausgabe_gbs = mysql_query($abfrage_gbs) or die("Fehler in Zeile " . __LINE__ . " in der Abfrage " . $abfrage_gbs . ", Fehlermeldung: " . mysql_error());
    Und was passiert, wenn Du den GROUP BY einfach weg lässt?
    Dann sollte das Ergebnis doch schon stimmen. Es werden die neuesten Bilder mit ihrem Order angezeigt.

    Vermutlich gilt jetzt noch diese Regel:
    Wenn es jetzt passiert, dass z. B. die beiden neuesten Bilder im selben Order sind, dann möchtest Du diesen Ordner nur einmal sehen, richtig?

    Grüße
    Thomas

    Kommentar


    • #3
      Hallo Thomas
      Zitat von thomas_w Beitrag anzeigen
      Und was passiert, wenn Du den GROUP BY einfach weg lässt?
      Dann sollte das Ergebnis doch schon stimmen. Es werden die neuesten Bilder mit ihrem Order angezeigt.
      Ja, das Ergebnis stimmt, jedoch wird jedes Bild angezeigt, also auch den Ordner dazu.

      Vielleicht muss ich noch ergänzen:
      Ich zeige ALLE Ordner an die es gibt mit einer while()-Schleife , doch möchte ich der Ordner mit dem neusten Bild zuerst anzeigen.

      Hallo Thomas
      Zitat von thomas_w Beitrag anzeigen
      Wenn es jetzt passiert, dass z. B. die beiden neuesten Bilder im selben Order sind, dann möchtest Du diesen Ordner nur einmal sehen, richtig?
      Genau, und wenn z.B. das neuste Bild im Ordner 3 liegt, das zweitneuste Bild im Ordner 8 liegt und dann das drittneuste Bild wieder im Ordner 3 liegt, darf es mir den Ordner 3 nicht nocheinmal anzeigen, sondern sollte eben dann der Ordner mit dem viertneusten Bild anzeigen usw.

      Kommentar


      • #4
        Anmerkung: Dein Thread-Titel "2 DB, Neuster Datensatz abfragen" ist nicht optimal in der Wortwahl, es handelt sich hier nicht um zwei Datenbanken, sondern um zwei Tabellen.

        Ansonsten habe ich mal folgendes Beispiel zusammen gebaut:

        Code:
        CREATE TABLE gallerien_ordner (
         ordner_2_id INT NOT NULL,
         ordner_name VARCHAR(10)
        );
        
        CREATE TABLE gallerien_dateien (
         datei_id INT NOT NULL,
         ordner_2_id INT NOT NULL,
         datei_name VARCHAR(10),
         datei_datum DATE
        );
        
        INSERT INTO gallerien_ordner VALUES 
        ( 1, 'Ordner-1'),
        ( 2, 'Ordner-2'),
        ( 3, 'Ordner-3');
        
        INSERT INTO gallerien_dateien VALUES
        ( 1, 1, 'datei-1', '2010-01-01' ),
        ( 2, 2, 'datei-2a', '2010-01-02' ),
        ( 3, 2, 'datei-2b', '2010-01-01' ),
        ( 4, 3, 'datei-3a', '2010-01-12' ),
        ( 5, 3, 'datei-3b', '2010-01-11' );
        
        
        SELECT go.ordner_name, MAX(gd.datei_datum), MAX(gd.datei_name) 
          FROM gallerien_ordner go,
               gallerien_dateien gd
         WHERE go.ordner_2_id = gd.ordner_2_id
         GROUP BY go.ordner_name
         ORDER BY gd.datei_datum DESC;
         
        +-------------+---------------------+--------------------+
        | ordner_name | MAX(gd.datei_datum) | MAX(gd.datei_name) |
        +-------------+---------------------+--------------------+
        | Ordner-3    | 2010-01-12          | datei-3b           |
        | Ordner-2    | 2010-01-02          | datei-2b           |
        | Ordner-1    | 2010-01-01          | datei-1            |
        +-------------+---------------------+--------------------+
        3 rows in set (0.00 sec)
        
        mysql>
        Hilft das ...?

        Grüße
        Thomas

        Kommentar


        • #5
          Zitat von thomas_w Beitrag anzeigen

          Ansonsten habe ich mal folgendes Beispiel zusammen gebaut:

          Code:
          INSERT INTO gallerien_ordner VALUES 
          ( 1, 'Ordner-1'),
          ( 2, 'Ordner-2'),
          ( 3, 'Ordner-3');
          
          INSERT INTO gallerien_dateien VALUES
          ( 1, 1, 'datei-1', '2010-01-01' ),
          ( 2, 2, 'datei-2a', '2010-01-02' ),
          ( 3, 2, 'datei-2b', '2010-01-01' ),
          ( 4, 3, 'datei-3a', '2010-01-12' ),
          ( 5, 3, 'datei-3b', '2010-01-11' );
          
          
          SELECT go.ordner_name, MAX(gd.datei_datum), MAX(gd.datei_name) 
            FROM gallerien_ordner go,
                 gallerien_dateien gd
           WHERE go.ordner_2_id = gd.ordner_2_id
           GROUP BY go.ordner_name
           ORDER BY gd.datei_datum DESC;
           
          +-------------+---------------------+--------------------+
          | ordner_name | MAX(gd.datei_datum) | MAX(gd.datei_name) |
          +-------------+---------------------+--------------------+
          | Ordner-3    | 2010-01-12          | datei-3b           | >> müsste die datei-3a sein
          | Ordner-2    | 2010-01-02          | datei-2b           | >> müsste die datei-2a sein
          | Ordner-1    | 2010-01-01          | datei-1            |
          +-------------+---------------------+--------------------+
          3 rows in set (0.00 sec)
          
          mysql>
          Hilft das ...?
          Habe es versucht, jedoch ist die Sortierung immer noch nicht ganz richtig.
          Frage: warum bei datei-name auch MAX()?

          Ich bin am überlegen, ob ich das Ganze ganz anders angehen muss..!?

          Kommentar


          • #6
            Zitat von prinzli Beitrag anzeigen

            Code:
            SELECT go.ordner_name, MAX(gd.datei_datum), MAX(gd.datei_name) 
              FROM gallerien_ordner go,
                   gallerien_dateien gd
             WHERE go.ordner_2_id = gd.ordner_2_id
             GROUP BY go.ordner_name
             ORDER BY gd.datei_datum DESC;
             
            +-------------+---------------------+--------------------+
            | ordner_name | MAX(gd.datei_datum) | MAX(gd.datei_name) |
            +-------------+---------------------+--------------------+
            | Ordner-3    | 2010-01-12          | datei-3b           | >> müsste die datei-3a sein
            | Ordner-2    | 2010-01-02          | datei-2b           | >> müsste die datei-2a sein
            | Ordner-1    | 2010-01-01          | datei-1            |
            +-------------+---------------------+--------------------+
            3 rows in set (0.00 sec)
            Stimmt, Du hast recht, da ist ein Fehler meinerseits im SQL drin.
            Ich bin mir ziemlich sicher, dass das Problem in etwa so lösbar ist. Muss mal eben den Datenbank PC starten und was ausprobieren. Melde mich dann wieder...

            Grüße
            Thomas

            Kommentar


            • #7
              Hallo Thomas

              Danke Deiner Hilfe!

              Ich habe nun was rausgefunden, welches das gewünschte Ergebnis ausgibt:
              PHP-Code:
              $abfrage_gbs "SELECT 
                                  *
                              FROM 
                                  gallerien_ordner, gallerien_dateien
                              WHERE
                                  gallerien_ordner.ordner_2_id = gallerien_dateien.ordner_2_id 
                              GROUP BY
                                  gallerien_ordner.ordner_2_id
                              ORDER BY
                                  MAX(gallerien_dateien.datum) DESC"
              ;
              $ausgabe_gbs mysql_query($abfrage_gbs) or die("Fehler in Zeile " __LINE__ " in der Abfrage " $abfrage_gbs ", Fehlermeldung: " mysql_error()); 
              Ob das so "sauber" ist, weiss ich jedoch nicht, doch es funktioniert.

              Gruss
              Prinzli

              Kommentar


              • #8
                Kannst ja alternativ noch dies probieren, Deine Lösung muss ich mal testen...(nach dem Essen)

                Code:
                mysql> SELECT go.ordner_name, gd3.datei_datum, gd3.datei_name
                    ->   FROM gallerien_ordner go
                    ->   JOIN (SELECT gd.ordner_2_id, MAX(gd.datei_datum) AS datei_datum
                    ->           FROM gallerien_dateien gd
                    ->          GROUP BY gd.ordner_2_id ) gd2
                    ->     ON gd2.ordner_2_id = go.ordner_2_id
                    ->   JOIN gallerien_dateien gd3
                    ->     ON gd3.ordner_2_id = gd2.ordner_2_id
                    ->    AND gd3.datei_datum = gd2.datei_datum
                    -> ORDER BY gd3.datei_datum DESC;
                +-------------+-------------+------------+
                | ordner_name | datei_datum | datei_name |
                +-------------+-------------+------------+
                | Ordner-3    | 2010-01-12  | datei-3a   |
                | Ordner-2    | 2010-01-02  | datei-2a   |
                | Ordner-1    | 2010-01-01  | datei-1    |
                +-------------+-------------+------------+
                3 rows in set (0.00 sec)
                
                mysql>
                Grüße
                Thomas

                Kommentar


                • #9
                  Wenn du nur die Ordner-Namen benötigst, gehts auch so:
                  Code:
                  SELECT DISTINCT ordner_name
                  FROM gallerien_ordner
                  INNER JOIN gallerien_dateien USING(ordner_2_id)
                  ORDER BY datei_datum DESC;

                  Kommentar

                  Lädt...
                  X