Subselects

MySQL, PostgreSQL, SQLite
ll0rd
Posts: 18
Joined: 2003-05-11 17:15

Subselects

Post by ll0rd » 2003-06-21 19:51

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?

gamecrash
Posts: 339
Joined: 2002-05-27 10:52

Re: Subselects

Post by gamecrash » 2003-06-21 19:58

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 ;)

ll0rd
Posts: 18
Joined: 2003-05-11 17:15

Re: Subselects

Post by ll0rd » 2003-06-21 20:01

@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

gamecrash
Posts: 339
Joined: 2002-05-27 10:52

Re: Subselects

Post by gamecrash » 2003-06-21 20:04

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 ;)

ll0rd
Posts: 18
Joined: 2003-05-11 17:15

Re: Subselects

Post by ll0rd » 2003-06-21 20:08

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);

olaf.dietsche
RSAC
Posts: 409
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Subselects

Post by olaf.dietsche » 2003-06-21 20:59

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)

ll0rd
Posts: 18
Joined: 2003-05-11 17:15

Re: Subselects

Post by ll0rd » 2003-06-21 21:04

eeehm...... das sollte gehen, geht aber net, btw. das ist im grunde das gleiche, was du unter code geschrieben hast

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: Subselects

Post by jtb » 2003-06-21 22:04

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?

ll0rd
Posts: 18
Joined: 2003-05-11 17:15

Re: Subselects

Post by ll0rd » 2003-06-21 22:13

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

<=>

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

olaf.dietsche
RSAC
Posts: 409
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Subselects

Post by olaf.dietsche » 2003-06-21 22:49

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;