Limit

So mein Freund Biber. Irgendwie kahm mir gerade das hier in den Sinn: Hau den Biber! :)

51QFu53kS0L.jpg


zurück zum Thema.
Wie willst du mit = MAX() den 2t Ältesten finden?
 
Moin Yaslaw,

wenn heute nicht ein Freitag wäre und deshalb ja alle ganz entspannt und flauschig sind, dann hätte ich ja nix geschrieben... ;)

Ich würde unter mySQL den Sonderfall so abfangen
SQL:
Select distinct t.name , t.alter from t405578 t

FROM t405578 t
WHERE
    (
        SELECT COUNT(*)
        FROM t405578 t1
        WHERE t1.age > t.age
    ) < 2
OR t.Alter in
( SELECT max(tmax.alter) as MaxAlter
FROM t405578 tmax
)
;

Also deine Mimik plus eine weitere OR-Klausel.

Wenn die beiden Ältesten 99 und 101 Jahre alt sind, bekomme ich zwei Datensätze.
Bei zwei Hundertjährigen auch.
Bei 5 Hundertjährigen als Älteste bekomme ich leider 5 Datensätze (das bekäme ich nur mit Rownum() oder LIMIT weg).

Eine Mimik mit "Erst Max(Alter), dann Max(Alter), welches kleiner ist als das erste Max(Alter)" bekomme ich mit mySQL nicht hin, solange da keine CTE-Syntax "With tabeX as (Select <bla>)" möglich ist.
Und das soll ja erst in einer der kommenden Versionen so sein.

P.S. @Habana:
Jeder namentliche Zugriff auf das Feld "Alter" braucht einen vorangestellten Alias (also t.alter, tmax.alter,..), da "Alter" ein reserviertes Wort ist.

Grüße
Biber
 
.. Darum verwendete ich das Feld Age und nicht alter *g*

Nach meinem Test ist es aber gar nicht nötig
SQL:
SELECT t.*
FROM t405578 t
WHERE
   (
   	SELECT COUNT(*)
      FROM t405578 t1
      WHERE t1.age > t.age
	) < 2;
SQL:
-- Abfrage auswerten
ID	AGE
2	8
4	7

-- Noch ein 8 Jähreiger hinzufügen und die Abfrage nochmals auswerten
insert into t405578(age) values(8);
ID	AGE
2	8
7	8

-- Noch ein 8 Jähreiger hinzufügen und die Abfrage nochmals auswerten
insert into t405578(age) values(8);
ID	AGE
2	8
7	8
8	8
 
Upps, Yaslaw,

hast recht... mein Fehler.

Na ja, dann halt so, um auch mit den 5 Hundertjährigen umzugehen:

SQL:
SELECT t.*

FROM t405578 t
WHERE
   (
    SELECT COUNT(*)
      FROM t405578 t1
      WHERE t1.age > t.age
    ) < 2

and
 ( SELECT COUNT(*)
      FROM t405578 t1
      WHERE t1.age=t.age and t1.name<t.name  
) <=1
;

Zugegeben, ein Sonderfall.
Aber Effekt. es sind eben max. 2 Sätze. auch bei mehreren Gleichaltrigen.

(Ich habe jetzt auch "age" statt "alter" genommen - wundert mich, dass es mysql ohne Theater und ohne Alias geschluckt hat mit "alter"-
Bei Oracle würde ich einen Syntaxfehler bekommen.)

Grüße
Biber
 
Zurück