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