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;