Page 1 of 1

Subselects

Posted: 2003-06-21 19:51
by ll0rd
Hi,

ich experementiere im mom mit MySQL 4.0.13-Max rum und wollte mal die subselects Funktion mal testen. Leider klappt das nicht so ganz, wie ich das wollte. Angenommen ich habe eine Tabelle mit 20 Einträgen. Eine Spalte hat den Namen "times". Bei jedem Ausführen des Befehls soll times=times+1 werden aber nur bei dem eintrag, wo times=max(times) ist.

Code: Select all

update adv set times=times+1 where times=max(times);
sowas geht ja sowieso net, also muss man das mit sebselects machen so in etwa hab ich es mir gedacht, jedoch meldet mysql nen error

Code: Select all

update adv set times=times+1 where times= (select max(times) from adv);
habt ihr ne ahnung, was da falsch ist?

Re: Subselects

Posted: 2003-06-21 19:58
by gamecrash
Hmmm... http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html
Subqueries are supported in MySQL version 4.1.
Wenn Du was anderes meinst, wär die Fehlermeldung vielleicht ganz sinnvoll ;)

Re: Subselects

Posted: 2003-06-21 20:01
by ll0rd
@GameCrash

ja, genau das meine ich

Code: Select all

ERROR 1064: You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select max(times) from adv' at line 1

Re: Subselects

Posted: 2003-06-21 20:04
by gamecrash
Jo, dann ist das Dein Problem. SubSelects werden erst ab MySQL Version 4.1 unterstützt, Du setzt Version 4.0 ein...

Wenn Du so ne gute SQL-Unterstützung brauchst, solltest Du vielleicht auf ne bessere Datenbank wechseln... => http://www.postgresql.org ;)

Re: Subselects

Posted: 2003-06-21 20:08
by ll0rd
aber laut der website kann 4.0 auch subselects in form von

Code: Select all

SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);

Re: Subselects

Posted: 2003-06-21 20:59
by olaf.dietsche
LL0rd wrote:aber laut der website kann 4.0 auch subselects in form von

Code: Select all

SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);
Falls das so geht, warum machst du es dann nicht so?

Code: Select all

update adv set times=times + 1 where times in (select max(times) from adv)

Re: Subselects

Posted: 2003-06-21 21:04
by ll0rd
eeehm...... das sollte gehen, geht aber net, btw. das ist im grunde das gleiche, was du unter code geschrieben hast

Re: Subselects

Posted: 2003-06-21 22:04
by jtb
LL0rd wrote:aber laut der website kann 4.0 auch subselects in form von

Code: Select all

SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);
sicher? wo steht das denn?

Re: Subselects

Posted: 2003-06-21 22:13
by ll0rd
SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);

<=>

update adv set times=times + 1 where times in (select max(times) from adv)

Re: Subselects

Posted: 2003-06-21 22:49
by olaf.dietsche
LL0rd wrote:eeehm...... das sollte gehen, geht aber net, btw. das ist im grunde das gleiche, was du unter code geschrieben hast
Ich habe mir mal das Handbuch angesehen und dort steht, daß das nicht geht. Aber ...

Du kannst ab Version 4.0 ein UPDATE mit zwei Tabellen machen. D.h. du erzeugst eine temporäre Tabelle, fügst das Maximum in diese Tabelle ein und machst damit dein update:

Code: Select all

create temporary table advmax (times int);
insert into advmax select max(times) from adv;
update adv, advmax set adv.times = adv.times + 1 where adv.times = advmax.times;