rainerTS: MySQL - Bedingung auf Maximum anwenden

Hallo,

ich hab ein kleines Problem mit einer SQL Abfrage:
ich frage

SELECT
MAX(time) AS time
FROM blabla
WHERE time < irgendeinwert

Dabei möchte ich aber nicht den Maximalwert, der die Bedingung erfüllt, sondern den Datensatz nur, falls der Maximalwert aller Datensätze die Bedingung erfüllt.

Hat jemand ne Idee?

Vielen Dank!

  1. Hi,

    Probiers mal so:

    SELECT time
       FROM blabla
       HAVING MAX(time) < irgendeinwert
       GROUP BY time

    Gruß
    Andi

    1. Hi,

      Probiers mal so:

      SELECT time
         FROM blabla
         HAVING MAX(time) < irgendeinwert
         GROUP BY time

      Gruß
      Andi

      Hmm, leider ist die Abfrage doch etwas komplexer - es ist eine Abfrage, welche meiner buddies / freunde einer Community gerade OFFline sind -> offline ist jemand, der entweder nicht in der Tabelle sessions steht, oder eben doch in der Tabelle steht, dessen größte Zeit aber kleiner ist als irgendeinwert

      SELECT
      buddies.buddy_id,
      buddies.buddy

      FROM
      buddies LEFT JOIN sessions ON buddies.buddy_id = sessions.user_id

      WHERE
      sessions.user_id IS NULL OR
      sessions.time < irgendeinwert

      GROUP BY       buddies.buddy_id

      ORDER BY
      buddies.buddy

      Wie bekomm ich da nun das HAVING rein, was ja eigentlich erst nach GROUP BY kommt, aber eine Alternative in der WHERE-Klausel darstellt?

      1. Halihallo rainerTS

        SELECT time
           FROM blabla
           HAVING MAX(time) < irgendeinwert
           GROUP BY time

        @Andi: GROUP BY ist *immer* vor HAVING!

        Hmm, leider ist die Abfrage doch etwas komplexer - es ist eine Abfrage, welche meiner buddies / freunde einer Community gerade OFFline sind -> offline ist jemand, der entweder nicht in der Tabelle sessions steht, oder eben doch in der Tabelle steht, dessen größte Zeit aber kleiner ist als irgendeinwert
        Wie bekomm ich da nun das HAVING rein, was ja eigentlich erst nach GROUP BY kommt, aber eine Alternative in der WHERE-Klausel darstellt?

        Entweder du machst es via Subselect in der WHERE-Klausel, oder mit
        einem Self-Join und GROUP BY über HAVING. Etwas mehr Fleisch um den
        Knochen:

        (Mit Subselect; MySQL>4.x):
        SELECT *
           FROM
              session
           WHERE
              time >= ALL(
                 SELECT time FROM session WHERE time IS NOT NULL
              )

        oder (mit HAVING und Self-Join; MySQL<4.x)

        SELECT a.sess_id, a.time
           FROM
              session AS a,
              session AS b
           GROUP BY
              <PRIMARY KEY('s) VON a> , a.time, ...
           HAVING
              a.time>=MAX(b.time)

        Bemerkung: in GROUP BY *muss* der gesamte PRIMARY KEY der Relation
        session (bezgl. Alias a) und alle Attribute, die in
        SELECT projeziert werden enthalten sein.

        Viele Grüsse

        Philipp

  2. hi,

    Dabei möchte ich aber nicht den Maximalwert, der die Bedingung erfüllt, sondern den Datensatz nur, falls der Maximalwert aller Datensätze die Bedingung erfüllt.

    Hat jemand ne Idee?

    ja - formuliere doch den beren satz bitte mal in verständlichem deutsch.

    ich habe keine idee, _was_ du willst.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."