Fallweise kein Ergebnis

Fallweise kein Ergebnis

am 01.02.2006 15:31:01 von Alexander Mueller

Hallo,

ich versuche mit folgender Abfrage alle Einträge mit dem nächstgrößten
Wert nach dem durch RAND()*MAX(field) generierten zu ermitteln, und aus
denen dann einen Zufälligen auszuwähen.

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

Grundsätzlich scheint es auch zu funktionieren, nur wird bei jedem
dritten oder vierten Mal ein leeres Ergebnis zurückgeliefert und ich
weiß nicht wirklich warum. Besonders deswegen nicht, weil die zweite
Subquery immer einen vorhandenen Wert liefert.

SELECT field
FROM table
WHERE field>
(select ROUND(RAND()*MAX(field))
from table)
ORDER BY field LIMIT 1


Falls jemand eine Antwort hat, wäre ich dankbar.

Alexander

Re: Fallweise kein Ergebnis

am 02.02.2006 00:55:07 von Stefan Rybacki

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alexander Mueller schrieb:
>
> Hallo,
>
> ich versuche mit folgender Abfrage alle Einträge mit dem nächstgrößten
> Wert nach dem durch RAND()*MAX(field) generierten zu ermitteln, und aus
> denen dann einen Zufälligen auszuwähen.
>
> SELECT *
> FROM table
> WHERE field=
> (SELECT field
> FROM table
> WHERE field>

Es liegt and dem größer, es muß ein größergleich sein, denn was passiert
wenn in unterer SubQuery RAND()=1 ist?

> (select ROUND(RAND()*MAX(field))
> from table)
> ORDER BY field LIMIT 1)
> ORDER BY RAND() LIMIT 1
>
>...



Bis denn dann
Stefan

> Alexander

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)

iD8DBQFD4UpayeCLzp/JKjARAneiAJ4j2F9fCO7EoEAWSOUywN3qMcxlyQCf YTRs
gs+Ho4SkXxswsE1RNcRNuEc=
=saSr
-----END PGP SIGNATURE-----

Re: Fallweise kein Ergebnis

am 02.02.2006 03:48:15 von Alexander Mueller

Stefan Rybacki wrote:
>
> Es liegt and dem größer, es muß ein größergleich sein, denn was passiert
> wenn in unterer SubQuery RAND()=1 ist?

Danke Stefan, aber leider macht das keinen Unterschied.

Grundsätzlich verstehe ich was Du meinst, jedoch bin ich nicht sicher ob
es hier wirklich das Problem ist, da 1 vermutlich selten gewählt wird,
ein leeres Ergebnis aber schon jedes dritte oder vierte Mal auftritt.
Auch habe ich bei meinen Tests mit der vorher erwähnten Subquery (auf
der der RAND() Fehler basieren würde) dieses Verhalten nie bekommen.

Danke,
Alexander

Re: Fallweise kein Ergebnis

am 02.02.2006 12:08:21 von Stefan Rybacki

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alexander Mueller schrieb:
> Stefan Rybacki wrote:
>>
>> Es liegt and dem größer, es muß ein größergleich sein, denn was passiert
>> wenn in unterer SubQuery RAND()=1 ist?
>
> Danke Stefan, aber leider macht das keinen Unterschied.
>
> Grundsätzlich verstehe ich was Du meinst, jedoch bin ich nicht sicher ob
> es hier wirklich das Problem ist, da 1 vermutlich selten gewählt wird,
> ein leeres Ergebnis aber schon jedes dritte oder vierte Mal auftritt.
> Auch habe ich bei meinen Tests mit der vorher erwähnten Subquery (auf
> der der RAND() Fehler basieren würde) dieses Verhalten nie bekommen.

was ich mich eh frage ist, wo der Unterschied zu einer Abfrage zu dieser
wäre:

SELECT * FROM table ORDER BY rand() LIMIT 1

?

Bis denn dann
Stefan

> Danke,
> Alexander

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)

iD8DBQFD4eglyeCLzp/JKjARAuFqAJ4ksqscwLiUp8feSauKMFXgmfJVvQCe JWbn
KJmHnqak4i0Oc7YGIoUol70=
=egEL
-----END PGP SIGNATURE-----

Re: Fallweise kein Ergebnis

am 02.02.2006 12:19:53 von Alexander Mueller

Stefan Rybacki wrote:
>
> was ich mich eh frage ist, wo der Unterschied zu einer Abfrage zu dieser
> wäre:
>
> SELECT * FROM table ORDER BY rand() LIMIT 1
>
> ?
>
> Bis denn dann
> Stefan

Daß ich hier mit Wahrscheinlichkeiten arbeite.

Alexander

Re: Fallweise kein Ergebnis

am 02.02.2006 12:52:53 von Stefan Rybacki

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alexander Mueller schrieb:
> Stefan Rybacki wrote:
>>
>> was ich mich eh frage ist, wo der Unterschied zu einer Abfrage zu dieser
>> wäre:
>>
>> SELECT * FROM table ORDER BY rand() LIMIT 1
>>
>> ?
>>
>> Bis denn dann
>> Stefan
>
> Daß ich hier mit Wahrscheinlichkeiten arbeite.

wirklich? Naja ich sehe das so:

1. wähle zufällig einen Wert x zwischen 0 und max(field)
2. ermittle einen von den kleinsten Einträgen für den gilt x<=field
3. ermittle alle Einträge, die field=field aus 2. sind und wähle
zufällig einen davon aus

Fragt sich jetzt wo die Wahrscheinlichkeiten reinspielen? Für mein
Verständnis liefert obige Abfrage eine genauso gute Verteilung der Werte.

Wir hatten vor nicht allzu langer Zeit mal ein ähnliches Problem, da
ging es um nicht gleichverteilte Einträge, die zufällig entsprechend
ihrer Auftrittswahrscheinlichkeit oft gewählt werden sollten.
Dazu siehe:

http://groups.google.de/group/alt.php.sql/browse_thread/thre ad/62355939fdcae7ca/e3fc30da7b02b43c?lnk=raot&hl=de#e3fc30da 7b02b43c


Bis denn dann
Stefan

>
> Alexander

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)

iD8DBQFD4fKVyeCLzp/JKjARAkQAAJ4o9HKgr90n+irZ3cvxZ7nXAKD2NgCf S0AJ
kymERhW4LluB3KFCcrro/Uo=
=DJ1I
-----END PGP SIGNATURE-----

Re: Fallweise kein Ergebnis

am 02.02.2006 13:10:01 von Alexander Mueller

Stefan Rybacki wrote:
>
> wirklich? Naja ich sehe das so:
>
> 1. wähle zufällig einen Wert x zwischen 0 und max(field)

Korrekt.

> 2. ermittle einen von den kleinsten Einträgen für den gilt x<=field

Nein, ermittle den nächstgrößten Eintrag.

> 3. ermittle alle Einträge, die field=field aus 2. sind und wähle
> zufällig einen davon aus

Korrekt.

>
> Fragt sich jetzt wo die Wahrscheinlichkeiten reinspielen? Für mein
> Verständnis liefert obige Abfrage eine genauso gute Verteilung der Werte.

Nicht ganz, da ein RAND() über die ganze Tabelle alle Einträge gleich
wertet.

Alexander

Re: Fallweise kein Ergebnis

am 02.02.2006 18:27:47 von Stefan Rybacki

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alexander Mueller schrieb:
> Stefan Rybacki wrote:
>>
>> wirklich? Naja ich sehe das so:
>>
>> 1. wähle zufällig einen Wert x zwischen 0 und max(field)
>
> Korrekt.
>
>> 2. ermittle einen von den kleinsten Einträgen für den gilt x<=field
>
> Nein, ermittle den nächstgrößten Eintrag.

Nunja, wenn ich den kleinsten Eintrag (kleinstes field) für den gilt
x<=field hab ich genau den nächstgrößeren ;) (ich hab das = mit
reingenommen, da wie gesagt sonst es unter Umständen kein nächstgrößerer
Eintrag vorhanden sein könnte)

>
>> 3. ermittle alle Einträge, die field=field aus 2. sind und wähle
>> zufällig einen davon aus
>
> Korrekt.
>
>>
>> Fragt sich jetzt wo die Wahrscheinlichkeiten reinspielen? Für mein
>> Verständnis liefert obige Abfrage eine genauso gute Verteilung der Werte.
>
> Nicht ganz, da ein RAND() über die ganze Tabelle alle Einträge gleich
> wertet.

Hmm, so ganz überzeugt bin ich nicht, weil ich wie gesagt den
Unterschied nicht wirklich sehe.

Deine Abfrage wählt einen Eintrag zufällig anhand eines zufälligen field
- -Wertes aus.
Meine Abfrage wählt einen Eintrag zufällig anhand einer zufälligen
Sortierung aus.
Hmm, lass mich gerne eines Besseren belehren, dass deine Abfrage genug
Sinn macht.

Bis denn dann
Stefan

>
> Alexander

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (MingW32)

iD8DBQFD4kETyeCLzp/JKjARAmfXAJ9JACr5PxIAMoPalWVYWhM0bRLZ8gCe NrG+
2xIk/bNzAOrhqehZzt5uilo=
=gjQJ
-----END PGP SIGNATURE-----