Rolf B: mysql WHERE und IN?

Beitrag lesen

Hallo Jörg,

wenn man so im Netz rumsucht, findet man Lösungen mit GROUP_CONCAT und FIND_IN_SET. Da ich kein geborener MySQLer bin, sondern von DB2 und MS SQL komme, ist das für mich fremdes Kauderwelsch. Aber möglicherweise kommst Du auch damit weiter.

Mein Vorgehen in dem Fall kennst Du, das hatten wir neulich mit dem Datums-Subselect.

Hier kannst Du ähnlich vorgehen.

Versuche, eine Query zu formulieren, die Dir pro ID das Kriterium für den "letzten Eintrag" findet. Wenn Du Dinge "pro Schlüsselbegriff" tun willst, sollte bei Dir automatisch das "GROUP BY" Glöckchen klingeln. Wenn Du pro ID das jüngste Datum haben willst, wäre es sowas:

SELECT id, MAX(datum) FROM table WHERE ID IN (4,7,11) GROUP BY id

Und da joinst Du table wieder dazu, so wie im vorigen Thread auch.

SELECT t2.id, t2.datum, t2.dings, t2.bums, ...
FROM (SELECT id, MAX(datum) as maxdat 
      FROM table 
      WHERE ID IN (4,7,11)
      GROUP BY id) t1
   JOIN
     table t2
   ON t1.id = t2.id AND t1.maxdat = t2.datum

Das "GROUP BY" bewirkt, dass die Maximumsuche nur innerhalb einer ID durchgeführt wird.

Die id in (4,7,11) Abfrage kannst Du in die innere Query packen oder als WHERE an die äußere Query hängen, ich würde nur mutmaßen, dass es schneller ist, die richtigen IDs vor dem Join herauszusuchen statt erstmal alles zu JOINen und dann zu filtern. Aber möglicherweise optimiert MySQL das ohnehin.

Es ist hier so, dass MAX(datum) die einzige Spalte ist, die Du als Vergleichswert brauchst. Deswegen geht es auch per Subselect und ist vermutlich auch übersichtlicher:

SELECT t2.id, t2.datum, t2.dings, t2.bums, ...
FROM table t2 
WHERE t2.id in (4,7,11)
  AND t2.datum = (SELECT MAX(datum) 
                  FROM table t1 
                  WHERE t1.id = t2.id)

Das Thema „wie finde ich die zwei jüngsten Einträge“ ist allerdings komplexer. Hier wird das ausführlich abgehandelt (auf englisch).

Rolf

--
sumpsi - posui - obstruxi