Merkwürdiges Ergebnis

Merkwürdiges Ergebnis

am 20.02.2006 16:26:24 von Alexander Mueller

Hallo,

I habe eine Tabelle mit einer Integer Spalte, die ich für
Wahrscheinlichkeitsberechnungen benutze (je höher ein Wert desto öfter
soll er gewählt werden).

Folgende Query sollte nun diese Wahrscheinlichkeiten einbeziehen, aber
es scheint, als ob sie Werte aus dem mittleren Bereich "bevorzieht".

SELECT * FROM table WHERE field>=(SELECT RAND()*MAX(field) FROM
table) ORDER BY field LIMIT 1

Wenn ich sie auf zwei aufteile, scheint sie zwar noch immer mittlere
Werte nicht "ungern" zu haben (Werte am oberen Ende werden noch immer
seltener genommen), aber zumindestens hat der höchste Wert jetzt
trotzdem Priorität.

random_value = SELECT RAND()*MAX(field) FROM table;
SELECT * FROM table WHERE field>=random_value ORDER BY field LIMIT 1

Hat irgendjemand eine Erklärung dafür oder vielleicht sogar eine bessere
Lösung? Danke

Re: Merkwürdiges Ergebnis

am 20.02.2006 16:57:35 von Dirk Brosowski

Alexander Mueller schrieb:
>
> Hallo,
>
> I habe eine Tabelle mit einer Integer Spalte, die ich für
> Wahrscheinlichkeitsberechnungen benutze (je höher ein Wert desto öfter
> soll er gewählt werden).
>
> Folgende Query sollte nun diese Wahrscheinlichkeiten einbeziehen, aber
> es scheint, als ob sie Werte aus dem mittleren Bereich "bevorzieht".
>
> SELECT * FROM table WHERE field>=(SELECT RAND()*MAX(field) FROM table)
> ORDER BY field LIMIT 1
>
> Wenn ich sie auf zwei aufteile, scheint sie zwar noch immer mittlere
> Werte nicht "ungern" zu haben (Werte am oberen Ende werden noch immer
> seltener genommen), aber zumindestens hat der höchste Wert jetzt
> trotzdem Priorität.
>
> random_value = SELECT RAND()*MAX(field) FROM table;
> SELECT * FROM table WHERE field>=random_value ORDER BY field LIMIT 1
>
> Hat irgendjemand eine Erklärung dafür oder vielleicht sogar eine bessere
> Lösung? Danke


Also: MAX(field) ist immer identisch, solange wie keine Inserts
stattfinden. Also machst du letztlich nur ein

SELECT * FROM table WHERE field>=random_value*const ORDER BY LIMIT 1

Wenn man jetzt noch bedenkt, dass random_value irgendwo zwischen 0 und 1
liegt, bleibt random_value*const letztlich irgendwo zwischen 0 und
const. Und zwar gleichverteilt. Und das kommt doch auch raus. Du wirst
da schon noch etwas ändern müssen.


Grüße

Dirk

Re: Merkwürdiges Ergebnis

am 20.02.2006 17:02:53 von Dirk Brosowski

Dirk Brosowski schrieb:
> Alexander Mueller schrieb:
>
>>
>> Hallo,
>>
>> I habe eine Tabelle mit einer Integer Spalte, die ich für
>> Wahrscheinlichkeitsberechnungen benutze (je höher ein Wert desto öfter
>> soll er gewählt werden).
>>
>> Folgende Query sollte nun diese Wahrscheinlichkeiten einbeziehen, aber
>> es scheint, als ob sie Werte aus dem mittleren Bereich "bevorzieht".
>>
>> SELECT * FROM table WHERE field>=(SELECT RAND()*MAX(field) FROM
>> table) ORDER BY field LIMIT 1
>>
>> Wenn ich sie auf zwei aufteile, scheint sie zwar noch immer mittlere
>> Werte nicht "ungern" zu haben (Werte am oberen Ende werden noch immer
>> seltener genommen), aber zumindestens hat der höchste Wert jetzt
>> trotzdem Priorität.
>>
>> random_value = SELECT RAND()*MAX(field) FROM table;
>> SELECT * FROM table WHERE field>=random_value ORDER BY field LIMIT 1
>>
>> Hat irgendjemand eine Erklärung dafür oder vielleicht sogar eine
>> bessere Lösung? Danke
>
>
>
> Also: MAX(field) ist immer identisch, solange wie keine Inserts
> stattfinden. Also machst du letztlich nur ein
>
> SELECT * FROM table WHERE field>=random_value*const ORDER BY LIMIT 1
>
> Wenn man jetzt noch bedenkt, dass random_value irgendwo zwischen 0 und 1
> liegt, bleibt random_value*const letztlich irgendwo zwischen 0 und
> const. Und zwar gleichverteilt. Und das kommt doch auch raus. Du wirst
> da schon noch etwas ändern müssen.

P.S.: Der Unterschied bei deinen beiden Varianten liegt natürlich daran,
dass du im fall der echten Subquery diese für jede Zeile neu berechnest.

Grüße

Dirk

Re: Merkwürdiges Ergebnis

am 20.02.2006 17:16:40 von Alexander Mueller

Dirk Brosowski wrote:
>
>
> Also: MAX(field) ist immer identisch, solange wie keine Inserts
> stattfinden. Also machst du letztlich nur ein
>
> SELECT * FROM table WHERE field>=random_value*const ORDER BY LIMIT 1
>
> Wenn man jetzt noch bedenkt, dass random_value irgendwo zwischen 0 und 1
> liegt, bleibt random_value*const letztlich irgendwo zwischen 0 und
> const.

Das ist korrekt, aber ja auch gewünscht.

Das merkwürdige ist, daß die Subquery Version offensichtlich eher Werte
aus dem mittleren Bereich bevorzieht und den oberen Bereich fast
ignoriert. Die zweite Version funktioniert besser.

> Und das kommt doch auch raus. Du wirst da schon noch etwas ändern müssen.

Was wäre Dein Vorschlag?

Danke.

Re: Merkwürdiges Ergebnis

am 20.02.2006 17:18:06 von Alexander Mueller

Dirk Brosowski wrote:
>
> P.S.: Der Unterschied bei deinen beiden Varianten liegt natürlich daran,
> dass du im fall der echten Subquery diese für jede Zeile neu berechnest.

Für jede Zeile? Ich kann Dir nicht ganz folgen. Die Version mit der
Subquery sollte doch eigentlich funktionell gleich mit der aufgeteilten
sein.

Re: Merkwürdiges Ergebnis

am 20.02.2006 19:54:20 von Dirk Brosowski

Alexander Mueller schrieb:
> Dirk Brosowski wrote:
>
>>
>>
>> Also: MAX(field) ist immer identisch, solange wie keine Inserts
>> stattfinden. Also machst du letztlich nur ein
>>
>> SELECT * FROM table WHERE field>=random_value*const ORDER BY LIMIT 1
>>
>> Wenn man jetzt noch bedenkt, dass random_value irgendwo zwischen 0 und
>> 1 liegt, bleibt random_value*const letztlich irgendwo zwischen 0 und
>> const.
>
>
> Das ist korrekt, aber ja auch gewünscht.
>
> Das merkwürdige ist, daß die Subquery Version offensichtlich eher Werte
> aus dem mittleren Bereich bevorzieht und den oberen Bereich fast
> ignoriert. Die zweite Version funktioniert besser.
>
>> Und das kommt doch auch raus. Du wirst da schon noch etwas ändern müssen.
>
>
> Was wäre Dein Vorschlag?

Ich würde da irgendetwas exponentielles mit reinbringen. Frag mich aber
nicht nach genauen Formeln ... ich weiss nur, dass das exponentielle
Wachstum die richtige Richtung wäre.

Grüße

Dirk

Re: Merkwürdiges Ergebnis

am 20.02.2006 19:55:30 von Dirk Brosowski

Alexander Mueller schrieb:
> Dirk Brosowski wrote:
>
>>
>> P.S.: Der Unterschied bei deinen beiden Varianten liegt natürlich
>> daran, dass du im fall der echten Subquery diese für jede Zeile neu
>> berechnest.
>
>
> Für jede Zeile? Ich kann Dir nicht ganz folgen. Die Version mit der
> Subquery sollte doch eigentlich funktionell gleich mit der aufgeteilten
> sein.


Aus meiner Sicht wird die Subquery für jede Zeile erneut berechnet.

Grüße

Dirk

Re: Merkwürdiges Ergebnis

am 20.02.2006 20:20:14 von dnoeth

Dirk Brosowski wrote:

>> Für jede Zeile? Ich kann Dir nicht ganz folgen. Die Version mit der
>> Subquery sollte doch eigentlich funktionell gleich mit der
>> aufgeteilten sein.
>
>
>
> Aus meiner Sicht wird die Subquery für jede Zeile erneut berechnet.

Solange keine Korrelation besteht, ist deine Sicht falsch.

Du meinst:
SELECT * FROM table t1
WHERE field>=
(SELECT RAND()*MAX(field) FROM table t2
where t1.field = t2.field
)

Dieter