sql >> Databasteknik >  >> RDS >> Mysql

Välj tidigaste datum och tid från listan över distinkta användarsessioner

Detta är en variant av problemet "största-n-per-grupp" som dyker upp på StackOverflow flera gånger i veckan.

SELECT 
        a1.accessid, 
        a1.date, 
        a1.time 
FROM 
        accesslog a1
LEFT OUTER JOIN
        accesslog a2
  ON (a1.accessid = a2.accessid AND a1.userid = a2.userid
    AND (a1.date > a2.date OR a1.date = a2.date AND a1.time > a2.time))
WHERE a1.userid = '1234'
  AND a2.accessid IS NULL;

Sättet detta fungerar är att vi försöker hitta en rad (a2) som har samma accessid och användar-id, och ett tidigare datum eller tidpunkt än raden a1. När vi inte kan hitta en tidigare rad måste a1 vara den tidigaste raden.

Angående din kommentar, jag har precis provat den med exempeldatan du angav. Det här är vad jag får:

+----------+------------+----------+
| accessid | date       | time     |
+----------+------------+----------+
|        1 | 2009-08-15 | 01:01:01 | 
|        2 | 2009-09-01 | 14:01:01 | 
+----------+------------+----------+

Jag använder MySQL 5.0.75 på Mac OS X.



  1. MySQL InnoDB-tabeller är korrupta - hur fixar jag?

  2. Oracle CASE-kortslutning fungerar inte i grupp av

  3. Postgresql Transaktions-ID hittades inte

  4. MySQL Workbench:Fel i fråga (1064):Syntaxfel nära "VISIBLE" på rad 1