user variables und left join / order by

user variables und left join / order by

am 13.03.2005 20:54:13 von Soenke Ufen

Hallo,

User Variablen scheinen bei "left join" und "order by" durcheinanger zu
kommen:

drop table if exists t1;
drop table if exists t2;
create table t1 (id int);
create table t2 (id int);

insert into t1 values (10);
insert into t1 values (20);
insert into t1 values (30);
insert into t1 values (25);

insert into t2 values (20);
insert into t2 values (10);
insert into t2 values (15);

select @tid:=t1.id
from t1 left join t2 on t1.id=t2.id
order by t1.id
limit 1;

select @tid;

--> snip <--

Das liefert:

@tid:=t1.id
10

@tid
25

Dies sieht mir arg nach einem mysql-Bug aus, das richtige Ergebnis wäre
@tid=10, oder habe ich da einen Denkfehler?

btw, ohne "order by" geht die Query durch, macht aber dann keinen Sinn
mehr.

Gruß,
Sönke

Re: user variables und left join / order by

am 14.03.2005 10:19:42 von Georg Richter

Soenke Ufen wrote:

> Das liefert:
>
> @tid:=t1.id
> 10
>
> @tid
> 25
>

Limit begrenzt lediglich die Anzahl der Datensätze im Resultset. Da du
keine Indexe verwendest müssen zuerst alle Datensätze abgearbeitet
(wobei die Wertezuweisung an die Variable erfolgt), dann sortiert und
schliesslich der erste Wert zurückgegeben werden.

Dass die Variable tid in diesem Fall den letzten Wert erhält ist kein
Bug, sondern das erwartete Ergebnis.

Setzt Du auf ID einen Index, sollte Deine Variable den gewünschten Wert
enthalten, da in diesem Fall LIMIT optimiert werden kann.

/Georg

Re: user variables und left join / order by

am 14.03.2005 21:02:27 von Soenke Ufen

Georg Richter wrote:
>
> Limit begrenzt lediglich die Anzahl der Datensätze im Resultset. Da du
> keine Indexe verwendest müssen zuerst alle Datensätze abgearbeitet
> (wobei die Wertezuweisung an die Variable erfolgt), dann sortiert und
> schliesslich der erste Wert zurückgegeben werden.
>

Wenn ich Dich richtig verstehe, so dürfte sich kein Unterschied ergeben,
falls man den Left Join einfach fortläßt. Allerdings ergibt

mysql> select @tid:=t1.id from t1 order by t1.id limit 1;
10
mysql> select @tid;
10

Sollte nach Deinen Erläuterungen nicht wieder das Ergebnis 25
erscheinen?


Grüße,
Sönke

Re: user variables und left join / order by

am 15.03.2005 11:01:58 von Georg Richter

Soenke Ufen wrote:
>
> mysql> select @tid:=t1.id from t1 order by t1.id limit 1;
> 10
> mysql> select @tid;
> 10
>
> Sollte nach Deinen Erläuterungen nicht wieder das Ergebnis 25
> erscheinen?

Nein, in diesem Fall weiss der Optimizer, dass er nach der ersten
Fundstelle abbrechen darf. Siehe dazu auch das Kapitel über LIMIT
Optimierung im Manual.

/Georg´