Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL-Tabellen: "last update"-Abfrage

Einklappen

Neue Werbung 2019

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

  • SQL-Tabellen: "last update"-Abfrage

    Einen schönen guten Tag,

    ich habe 2 Tabellen "html_contents" & "events". BEIDE haben die (gleichnamigen) Spalten "created_at" & "updated_at".
    Ich möchte nun folgendes erreichen - wenn möglich NUR mit MySQL:
    Nach der Abfrage beider Tabellen soll nur EIN Tabellenfeld BEIDER Tabellen "ausgespuckt" werden - "created_at ODER "updated_at" -
    je nachdem, welches eben aktueller ist, sodass ich das Ergebnis der Abfrage (zum Beispiel) in der Variable $lastupdate abspeichern kann.

    Ich hab schon einiges diesbez. ausprobiert - jüngst folgendes gestern - jedoch bin ich - im wahrsten Sinne des Wortes - mit dem Ergebnis nicht (wirklich) zufrieden,
    denn da müsste ich dann (nachträglich) "mit PHP zuviel rumbasteln". Also, hier mal mein (gestriger) SQL-Code:
    Code:
    SELECT `html_contents`.`created_at`, `html_contents`.`updated_at`, `events`.`created_at`, `events`.`updated_at`
    FROM `events`
    LEFT JOIN `html_contents` ON `html_contents`.`id` = `events`.`id`
    WHERE (`html_contents`.`created_at` < `events`.`created_at` OR `html_contents`.`updated_at` != NULL) AND
    (`html_contents`.`updated_at` < `events`.`updated_at` OR `events`.`updated_at` != NULL);
    Hat jemand ne Idee, wie es in einem Rutsch funzt/funzen KANN (NUR mysql)? Ideen-ANSATZ würde schon mal reichen, denn ich stehe auf HILFE FÜR SELBSTHILFE!!!


    Danke im Vorraus für eure AWs/Ideen &
    mfG Andreas

    komisch: Kaum macht man`s richtig funktioniert`s a scho.

  • #2
    Setze das Feld updated_at von Anfang an auch mit dem Erstellungs-Datum, dann hast du das Problem nicht.

    Wenn das updated_at Feld leer/NULL sein sollte, dann kannst du mit dieser Update-Abfrage das Feld füllen und kannst anschliessend nach dem updated-Feld sortiert ausgeben. Das vereinfacht dir die Sache.

    PHP-Code:
    UPDATE
        
    `events`
    SET     
        
    `updated_at` = `created_at`
    WHERE
        
    `updated_atIS NULL OR `updated_at`= '0000-00-00'
    Das mit dem 0000-00-00 für Datum gilt nur für MySql, schau aber lieber rein, was da wirklich drin steht.
    Das gleiche machst du mit der anderen Tabelle, damit du die beide auf gleichem Stand hast.

    Kommentar


    • #3

      besten Dank - hab da einfach zu kompliziert gedacht --> *Wald vor lauter Bäume nicht mehr sehen schähm Smiley*
      [...] gilt nur für MySql, schau aber lieber rein, was da wirklich drin steht.
      Auch bei anderen Projekten von mir stand bis jetzt (wenn ich mich jetzt richtig erinnere) IMMER "NULL" drin. --> alles My-SQL DBs.

      LG Andreas

      komisch: Kaum macht man`s richtig funktioniert`s a scho.

      Kommentar


      • #4
        Jetzt hab ich jedoch DOCH NOCH ein Problem:
        Wenn ich folgende Abfrage ausführe ...
        Code:
        SELECT `html_contents`.`updated_at`, `events`.`updated_at`
        FROM `events` LEFT JOIN `html_contents` ON `html_contents`.`id` = `events`.`id`;
        ... bekomme ich als Ergebnis 2 "updated_at"-Spalten --> wie bekomme ich das Ergebnis der Abfrage in EINE Spalte, dass ich nur noch mit "DESC" & "LIMIT 1" das aktuellste Datum mit Uhrzeit "ausgespuckt" bekomme - also NUR EIN Tabellenfeld/Datensatz?

        LG Andreas

        komisch: Kaum macht man`s richtig funktioniert`s a scho.

        Kommentar


        • #5
          Ist ja logisch du führst ja auch beide Spalten der Tabellen auf.
          Willst du denn beide updated_at Felder zusammenfassen?
          Ich verstehe nicht ganz was das soll, denn wenn Tabelle events ein neueres Datum hat als zum Beispiel der zugehörige Datensatz in html_contents, was willst du dann anzeigen?
          Wenn sie gleich sind ist ja egal welche Spalte von welcher Tabelle du nimmst.

          EDIT;
          Ich denke ich verstehe dich jetzt. Du kannst das im SELECT mit einem if-Statement abbilden, so dass du nur das updated_at Feld nimmst welches jünger ist und dieses dann als alias anzeigst

          Versuche mal das selbst hinzubekommen, wenn du es nicht schaffst, melde dich einfach noch mal mit deinem Versuch.

          Kommentar


          • #6
            Wenn sie gleich sind ist ja egal welche Spalte von welcher Tabelle du nimmst.
            --> nicht ganz, - denn: "html_contents" & "events" haben VERSCHIEDENE Inhalte. -->

            --> bez. "deinem EDIT": DA hast du mich SCHON EHER verstanden.

            Versuche mal das selbst hinzubekommen, wenn du es nicht schaffst, melde dich einfach noch mal mit deinem Versuch.
            --> Mach ich, DANKE!!!

            komisch: Kaum macht man`s richtig funktioniert`s a scho.

            Kommentar


            • #7
              Ich habs nach ca. 30 Minuten bissl rumprobieren geschafft!!! ...
              UND die Lösung möchte ich Euch natürlich NICHT vorenthalten:
              PHP-Code:
              SELECT IF(
                  
              MAX(`html_contents`.`updated_at`) > MAX(`events`.`updated_at`), MAX(`html_contents`.`updated_at`), MAX(`events`.`updated_at`)
              ) AS `
              lastupdated`
              FROM `html_contents`, `events`

              VIELEN HERZLICHEN DANK - SPEZIELL AN protestix!!!

              Kann mir bitte jemand sagen, wie man einen Beitrag hier als "erledigt" markiert?

              MFG Andreas.

              komisch: Kaum macht man`s richtig funktioniert`s a scho.

              Kommentar


              • #8
                Das MAX() brauchst du aber nicht. Vergleich die Werte doch direkt^^'
                [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                Kommentar


                • #9
                  und ohne Join Kriterien?!

                  Kommentar


                  • #10
                    Das MAX() brauchst du aber nicht. Vergleich die Werte doch direkt^^
                    Mit MAX() stelle ich sicher, dass ich WIRKLICH den LETZTEN/JÜNGSTEN Eintrag bekomme.

                    und ohne Join Kriterien?!
                    Zawos!?!?

                    ... Es funzt seit dem Posting meiner Lösung problemlos.

                    UND NOCHMALS GEFRAGT:
                    Kann mir bitte jemand sagen, wie man einen Beitrag hier als "erledigt" markiert?


                    MFG Andreas.

                    komisch: Kaum macht man`s richtig funktioniert`s a scho.

                    Kommentar


                    • #11
                      Kannst du mal deine ganze Abfrage zeigen? Idealerweise auch Beispieldaten. Hast du in beiden Tabellen nur jeweils einen Datensatz?
                      UND NOCHMALS GEFRAGT:
                      Kann mir bitte jemand sagen, wie man einen Beitrag hier als "erledigt" markiert?
                      Sowas gibts hier nicht.
                      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                      Kommentar


                      • #12
                        Zitat von VPh Beitrag anzeigen
                        Kannst du mal deine ganze Abfrage zeigen? Idealerweise auch Beispieldaten. Hast du in beiden Tabellen nur jeweils einen Datensatz?
                        1. Die Lösung, die ich oben gepostet habe, IST DIE GANZE Abfrage!!!
                        2. "Beispieldaten": schau dich mal DORT um, da findest du welche: http://www.mitwelt-fairstehen.eu/ --> Ist ne Website, die ich für ne Kundin JÜNGST gemacht habe. -->
                          Daher sind noch nicht so viele "Beispieldaten" vorhanden.
                        3. Nein, mehrere Datensätze in BEIDEN Tabellen - siehe dazu Punkt 2;
                        4. Das "formatierte" "End-" Ergebnis der Abfrage, findest du auf der oben genannten Website - in der Desktopversion - ganz rechts unten im Footer - bei "last update:"


                        Zitat von VPh Beitrag anzeigen
                        Sowas gibts hier nicht.
                        Schade - das gab es zumindest, als ich mich Okt. 2013 registriert habe.
                        Hier, mit Verlaub, ein kleiner Appell an die Moderatoren/Programmierer dieses Forums:
                        War ziemlich hilfreich für Leser & Helfer, da man sofort wusste, ob jemand zu dem Thema noch (eine) Frage(n) hat.

                        mfG Andreas

                        komisch: Kaum macht man`s richtig funktioniert`s a scho.

                        Kommentar


                        • #13
                          Ach das eine Datum gilt für alle Seiten... schätze ich.
                          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                          Kommentar


                          • #14
                            Zitat von VPh Beitrag anzeigen
                            Ach das eine Datum gilt für alle Seiten... schätze ich.
                            Du BIST aber auch ein Blitzkneiser mit EXTRAVAGANTEM Scharfsinn!!!

                            komisch: Kaum macht man`s richtig funktioniert`s a scho.

                            Kommentar


                            • #15
                              Zitat von APH Beitrag anzeigen
                              War ziemlich hilfreich für Leser & Helfer, da man sofort wusste, ob jemand zu dem Thema noch (eine) Frage(n) hat.
                              Oder auch nicht, denn dann würde ich dir nicht erzählen, dass deine Lösung eher schlecht ist. Der Query erezugt ein Kreuzprodukt. Das kann selbst bei wenig Datensätzen problematisch werden.

                              Besser ist eine UNION Abfrage, oder zwei Subqueries.

                              PHP-Code:
                              SELECT
                                  MAX
                              (`html_contents`.`updated_at`) AS updated_at
                              FROM
                                  html_contents
                              UNION
                              SELECT
                                  MAX
                              (`events`.`updated_at`) AS updated_at
                              FROM
                                  events
                              ORDER BY
                                  updated_at DESC
                              LIMIT
                                  1 
                              PHP-Code:
                              SELECT
                                  GREATEST
                              (
                                      (
                              SELECT MAX(`html_contents`.`updated_at`) FROM html_contents),
                                      (
                              SELECT MAX(`events`.`updated_at`) FROM events),
                                  ) AS 
                              updated_at 

                              Kommentar

                              Lädt...
                              X