GROUP BY - ORDER BY zusammenspiel

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

  • GROUP BY - ORDER BY zusammenspiel

    Hallo..

    ich verwende folgende Tabelle für meine Sessions:

    Code:
    CREATE TABLE `cms_sessions` (
      `ses_id` int(10) NOT NULL auto_increment,
      `ses_session` varchar(255) NOT NULL default '',
      `ses_dateon` datetime NOT NULL default '0000-00-00 00:00:00',
      `ses_dateoff` datetime default NULL,
      `ses_ip` varchar(255) NOT NULL default '',
      `ses_client` text NOT NULL,
      `ses_host` varchar(255) NOT NULL default '',
      `ses_user_id` int(10) NOT NULL default '0',
      `ses_lastact` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`ses_id`),
      KEY `ses_session` (`ses_session`,`ses_user_id`)
    ) TYPE=MyISAM AUTO_INCREMENT=159 ;
    In Verbindung meiner Usertabelle möchte ich User-Logins absteigend sortieren & darstellen - und das wenn möglich, möglichst über MySQL. Das Problem ist, dass DISTINCT oder GROUP BY sich den ersten DS mit kleinsten ID bzw. "ältesten" Eintrag "schnappt".

    Die Abfrage sieht im Moment wie folgt aus:

    Code:
                SELECT
                   DATE_FORMAT(MAX(s.ses_dateon), '%d.%m.%Y - %H:%i') AS ses_dateon,
                   s.ses_user_id AS user_id,
                   u.user_gender
                FROM
                  ".T_SESSIONS." s
                INNER JOIN
                  ".T_USERS." u ON s.ses_user_id = u.user_id
                WHERE
                   u.user_active = '1' AND
                   u.kill_account IS NULL
                GROUP BY
                   s.ses_user_id
                ORDER BY
                   s.ses_dateon DESC
                LIMIT
                   ".$max."

    Für mich gibt es anscheinend keine Lösung? Es wäre interessant zu erfahren, wie man so ein "Group by - ORDER BY"-Problem am besten löst... :]

    Ich hoffe, dass Thema ist kein No-Way-Thread :P

    Grüße

    EDIT:

    In der Tabelle können von einem jeweiligen User mehrere Einträge vorhanden sein.

    Wen's juckt: Logins die über 3 Monate her sind, werden per Cronjob einmal am Tag gekillt

    Zuletzt geändert von xManUx; 09.12.2005, 17:38.

    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
    sondern mit den Augen das Manual zu lesen.

  • #2
    Hat niemand ein ähnliches Problem oder mal gehabt?
    Oder ist meine Problembeschreibung zu mager?

    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
    sondern mit den Augen das Manual zu lesen.

    Kommentar


    • #3
      dein alias überschreibt das feld quasi selber. daher sortierst du nach dem alias.
      nimm mal einen anderen alias für dein feld zum sortieren.
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        Danke für deine Antwort.

        Folgende Ändernung sortiert immer noch nicht richtig:
        Code:
                    SELECT
                       DATE_FORMAT(MAX(s.ses_dateon), '%d.%m.%Y - %H:%i') AS datum,
                       s.ses_user_id AS user_id,
                       u.user_gender
                    FROM
                      ".T_SESSIONS." s
                    INNER JOIN
                      ".T_USERS." u ON s.ses_user_id = u.user_id
                    WHERE
                       u.user_active = '1' AND
                       u.kill_account IS NULL
                    GROUP BY
                       s.ses_user_id
                    ORDER BY
                       datum
                    LIMIT
                       ".$max."
        So wie es aussieht, findet er den ersten niedrigsten Eintrag und hört auf für den User zu "suchen". Würde ich MAX() weglassen, würde er das kleinste(älteste) Datum anzeigen.

        Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
        sondern mit den Augen das Manual zu lesen.

        Kommentar


        • #5
          Hi,
          soweit ich weiß, sortiert MySQL ein
          DATE_FORMAT(MAX(s.ses_dateon), '%d.%m.%Y - %H:%i') AS datum
          nach den Zeichen. So kommt z.B so eine Reihe zustande:
          02.08.2005
          15.01.2006
          27.12.2005

          Wenn dir das auch nicht weiter hilft, fällt mir nur noch das Stichwort Sub-Queries ein :-/
          nicht alles, was nass ist, kann fliegen

          Kommentar


          • #6
            Original geschrieben von xManUx
            Danke für deine Antwort.
            aber korrekt umgesetzt hast du es immer noch nicht!

            du sollst NICHT nach dem alias sortieren, sondern nach dem feld-namen selber!
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              SUB-Queries bei meinem Hoster mit der MySQL-Version leider nicht möglich. :/

              @Abraxax

              Sorry Hatte leider auch nichts gebracht. Deswegen hatte ich danach gleich:

              Code:
              ORDER BY
                 UNIX_TIMESTAMP(s.ses_dateon) DESC
              probiert, dass immer noch das Gleiche (falsche Sortierung) ausspuckt ... ich denke, eine MySQL-Lösung ohne SUB-Queries gibt's da wohl nicht? :/

              Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
              sondern mit den Augen das Manual zu lesen.

              Kommentar

              Lädt...
              X