SQL: MySQL 5.x nach 4.x

SQL: MySQL 5.x nach 4.x

am 08.02.2007 05:38:38 von Thomas Steinert

Hallo zusammen!

Ich habe in einer MySQL v5.x Datenbank zwei Tabellen.
Tabelle 1 beinhaltet Stammdaten von Usern, Tabelle 2 ist quasi eine
History, wann sich welcher User eingeloggt hat.
Im Browser zeige ich auf einer Seite die Namen aller eingetragenen User
an (Tabelle 1) und möchte gleichzeitig nur das *letzte* Logindatum der
aufgelisteten User anzeigen.
Unter/Mit MySQL 5.x und PHP habe ich das wie folgt realisiert und es
funktioniert auch wunderbar:

SELECT * FROM {Tabelle 2} WHERE LastLogin=(SELECT MAX(LastLoginDate)
FROM {Tabelle 2} WHERE UserID={..});

Anm.: LastLoginDate ist vom typ Date.

Selbiger SQL-Abfrage mit den gleichen Tabellen, Tabellennamen und
Tabellenfeldern funktioniert unter MySQL 4.0.24 nicht, hier erhalte ich
einen:
"MySQL Error 1064...near SELECT(MAX(LastLoginDate) FROM {Tabelle 2} WHERE
UserID=..."

Frage: Wie muss die SQL-Abfrage für MySQL 4 korrekt lauten?

Dank im voraus für Tipps&Hinweise

Gruß, Thomas

Re: SQL: MySQL 5.x nach 4.x

am 08.02.2007 16:23:06 von sylvio runge

Thomas Steinert wrote:
>
> Hallo zusammen!
>
> Ich habe in einer MySQL v5.x Datenbank zwei Tabellen.
> Tabelle 1 beinhaltet Stammdaten von Usern, Tabelle 2 ist quasi eine
> History, wann sich welcher User eingeloggt hat.
> Im Browser zeige ich auf einer Seite die Namen aller eingetragenen User
> an (Tabelle 1) und möchte gleichzeitig nur das *letzte* Logindatum der
> aufgelisteten User anzeigen.
> Unter/Mit MySQL 5.x und PHP habe ich das wie folgt realisiert und es
> funktioniert auch wunderbar:
>
> SELECT * FROM {Tabelle 2} WHERE LastLogin=(SELECT MAX(LastLoginDate)
> FROM {Tabelle 2} WHERE UserID={..});
>
> Anm.: LastLoginDate ist vom typ Date.
>
> Selbiger SQL-Abfrage mit den gleichen Tabellen, Tabellennamen und
> Tabellenfeldern funktioniert unter MySQL 4.0.24 nicht, hier erhalte ich
> einen:
> "MySQL Error 1064...near SELECT(MAX(LastLoginDate) FROM {Tabelle 2} WHERE
> UserID=..."
>
> Frage: Wie muss die SQL-Abfrage für MySQL 4 korrekt lauten?
mysql4.0.x kann noch keine SubQuerys; Du musst 2 getraennte Querys machen und
die von der Programmiersprache her in einer Schleife durchlaufen lassen.
Oder installierte/nutze mysql5... :)

S.

Re: SQL: MySQL 5.x nach 4.x

am 08.02.2007 16:45:16 von Thomas Rachel

sylvio runge wrote:

> mysql4.0.x kann noch keine SubQuerys; Du musst 2 getraennte Querys machen
> und die von der Programmiersprache her in einer Schleife durchlaufen
> lassen.

Oder - evtl. - mit einer temporären Tabelle arbeiten. (bzw. in diesem Fall,
da nur eine Ausgabezeile bei dem Subquery rauskommt: mit einer Variablen)

LOCK TABLES {Tabelle 2} READ;
SELECT MAX(LastLoginDate) INTO @maxlogin FROM {Tabelle 2} WHERE UserID={..};
/* oder SELECT @maxlogin:=MAX(LastLoginDate) FROM {Tabelle 2} WHERE
UserID={..}; */
SELECT * FROM {Tabelle 2} WHERE LastLogin=@maxlogin;
UNLOCK TABLES

(ungetestet!)


Thomas
--
Auf das elementare Zerwürfnis des Seins!

Re: SQL: MySQL 5.x nach 4.x

am 08.02.2007 16:52:04 von B.Steinbrink

On Thu, 08 Feb 2007 05:38:38 +0100, Thomas Steinert wrote:

> Hallo zusammen!
>
> Ich habe in einer MySQL v5.x Datenbank zwei Tabellen.
> Tabelle 1 beinhaltet Stammdaten von Usern, Tabelle 2 ist quasi eine
> History, wann sich welcher User eingeloggt hat.
> Im Browser zeige ich auf einer Seite die Namen aller eingetragenen User
> an (Tabelle 1) und möchte gleichzeitig nur das *letzte* Logindatum der
> aufgelisteten User anzeigen.
> Unter/Mit MySQL 5.x und PHP habe ich das wie folgt realisiert und es
> funktioniert auch wunderbar:
>
> SELECT * FROM {Tabelle 2} WHERE LastLogin=(SELECT MAX(LastLoginDate)
> FROM {Tabelle 2} WHERE UserID={..});
>
> Anm.: LastLoginDate ist vom typ Date.
>
> Selbiger SQL-Abfrage mit den gleichen Tabellen, Tabellennamen und
> Tabellenfeldern funktioniert unter MySQL 4.0.24 nicht, hier erhalte ich
> einen:
> "MySQL Error 1064...near SELECT(MAX(LastLoginDate) FROM {Tabelle 2} WHERE
> UserID=..."
>
> Frage: Wie muss die SQL-Abfrage für MySQL 4 korrekt lauten?

SELECT
x.*
FROM
Tab2 x
LEFT JOIN
Tab2 y ON (y.UserID = x.UserID AND y.LastLoginDate > x.LastLoginDate)
WHERE
y.UserID IS NULL

Das sucht für jede UserID genau die Zeile raus, für die kein größerer
letzter Loginzeitpunkt mehr existiert.

Björn

Re: SQL: MySQL 5.x nach 4.x

am 08.02.2007 20:06:31 von Thomas Steinert

Björn Steinbrink schrieb:
> Das sucht für jede UserID genau die Zeile raus, für die kein größerer
> letzter Loginzeitpunkt mehr existiert.

Super, danke, das war es! :-)

@Sylvio: Es obligt (leider!) nicht mir, eine neuere MySQL-Version
einzuspielen. Ich habe mir auf einer Windows-Kiste XAMPP mit MySQL v5.0.27.

Gruß, Thomas