Ankündigung

Einklappen
Keine Ankündigung bisher.

Alle User ausgeben, deren letztes Datum älter als 3 Monate

Einklappen

Neue Werbung 2019

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

  • Alle User ausgeben, deren letztes Datum älter als 3 Monate

    Hallo, ich möchte die beide folgenden Tabellen nutzen, um eine Liste zu generieren, die die User enthält, deren letzte call länger als 3 Monate her ist.

    User
    id | username
    ---------------
    7 | Ralf
    9 | Klaus
    14 | Nico


    User_data
    id | user_id | call
    ---------------------
    1 | 7 | 1407830400 //12.08.2014 um 10:00 Uhr
    2 | 9 | 1389538800 //12.01.2014 um 16:00 Uhr
    3 | 9 | 1394190000 //07.03.2014 um 12:00 Uhr
    4 | 9 | 1397037600 //09.04.2014 um 12:00 Uhr
    5 | 7 | 1389517200 //12.01.2014 um 10:00 Uhr
    6 | 14 | 1391353200 //02.02.2014 um 16:00 Uhr
    7 | 14 | 1394190000 //07.03.2014 um 12:00 Uhr


    gewünschte Ausgabe:

    Username| Last call | calls
    -----------------------------
    Klaus | 09.04.2014 | 3
    Nico | 07.03.2014 | 2

    Ich habe gestern Abend dran gesessen.
    Es funktioniert nur, wenn ich mich in der WHERE nicht auf das "vor > 3 Monaten" beziehe.
    Ich kann mich in der WHERE Klausel nicht auf MAX() beziehen.
    Gibt es eine Alternative?
    Eine Unterabfrage oder arbeiten mit HAVING?

    Hab den SQL zu Hause liegen, ich schreibe hier nur, weil es mich in meiner Pause beschäftigt.


  • #2
    Hi,

    wie sieht dein Statement aus? Mit DATEDIFF wäre eine Möglichkeit, die mir ad hoc einfällt, aber du kansnt das auch mit INTERVAL usw. lösen.

    mfg wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Zitat von igadim Beitrag anzeigen
      Ich kann mich in der WHERE Klausel nicht auf MAX() beziehen.
      Gibt es eine Alternative?
      Eine Unterabfrage oder arbeiten mit HAVING?
      Having ist Dein Freund.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von wolf29 Beitrag anzeigen
        Hi,

        wie sieht dein Statement aus? Mit DATEDIFF wäre eine Möglichkeit, die mir ad hoc einfällt, aber du kansnt das auch mit INTERVAL usw. lösen.

        mfg wolf29
        Im Prinzip so:

        SELECT
        MAX(a.call) AS maxD,
        ...
        FROM
        User_data a,
        User b
        WHERE
        a.user_id = b.id
        AND
        FROM_UNIXTIME(a.call) <= DATE_SUB(NOW(), INTERVAL 3 MONTH)

        Kommentar


        • #5
          INNER JOIN, GROUP BY und

          Zitat von akretschmer Beitrag anzeigen
          Having ist Dein Freund.
          ...und da du ein Timestamp in der Datenbank hast würde ich den fixen Vergleichswert "vor 3 Monaten" in ein UNIX_TIMESTAMP umrechnen und diesen mit den Datenbankwerten vergleichen.
          PHP-Klassen auf github

          Kommentar


          • #6
            Sollte funktionieren:
            SELECT u.id, u.username FROM user u WHERE u.id NOT IN (SELECT DISTINCT ud.user_id FROM user_date ud WHERE DATE_SUB(NOW(), INTERVAL 3 MONTH)) > ud.call;

            Kommentar


            • #7
              Ich weis nicht, ob ein Sub-Select einem Join und Groub By vorzuziehen ist. Von der Performance wird das wohl eher negativer sein.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar

              Lädt...
              X