Umsortieren eines Query-Ergebnisses

Umsortieren eines Query-Ergebnisses

am 01.07.2006 20:28:18 von Hans Mayr

Hallo,

ich möchte eine Anzahl Datensätze auswählen und diese dann in einer
bestimmten Reihenfolge ausgeben. Schritt 1 habe ich hier gefunden
funktioniert z.B. über

$sql =3D "SELECT name, vorname FROM table ORDER BY REVERSE(RAND()) LIMIT
> 5"
$result =3D mysql_query($sql);

Nun möchte ich diese fünf Einträge aber nach Nachnamen sortiert
haben. Wie kann ich das machen? Ich habe keine Möglichkeit gefunden,
$result umzusortieren.

Bitte um Hilfe.=20

Grüße und Dank

Hans Mayr

Re: Umsortieren eines Query-Ergebnisses

am 01.07.2006 20:50:45 von Kai Ruhnau

Hans Mayr wrote:
> ich möchte eine Anzahl Datensätze auswählen und diese dann in einer
> bestimmten Reihenfolge ausgeben. Schritt 1 habe ich hier gefunden
> funktioniert z.B. über
>
> $sql = "SELECT name, vorname FROM table ORDER BY REVERSE(RAND()) LIMIT
>> 5"
> $result = mysql_query($sql);

Lass doch bitte den PHP-Schmodder weg. Der rauscht nur unnötig.

Wofür benutzt du REVERSE? Was erhoffst du dir davon, eine
String-Funktion auf eine Gleitkommazahl anzuwenden?

> Nun möchte ich diese fünf Einträge aber nach Nachnamen sortiert
> haben. Wie kann ich das machen? Ich habe keine Möglichkeit gefunden,
> $result umzusortieren.

Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
Ergebnis zu sortieren:

SELECT *
FROM (
SELECT name, vorname
FROM table
ORDER BY RAND()
LIMIT 5
) AS auswahl
ORDER BY 1;

Grüße
Kai


--
This signature is left as an exercise for the reader.

Re: Umsortieren eines Query-Ergebnisses

am 01.07.2006 21:22:44 von Hans Mayr

Hallo Kai,

Danke für die Antwort.
> > $sql =3D "SELECT name, vorname FROM table ORDER BY REVERSE(RAND()) LIMIT
> >> 5"
> > $result =3D mysql_query($sql);
>
> Wofür benutzt du REVERSE? Was erhoffst du dir davon, eine
> String-Funktion auf eine Gleitkommazahl anzuwenden?

Weil ich gelesen habe, dass Rand() allein nicht allzu "zufällig" ist
und die Zufallsauswahl bei einer geringen Anzahl von Datensätzen der
Grundmenge sehr häufig die gleichen Treffer bringt.

> > Nun möchte ich diese fünf Einträge aber nach Nachnamen sortiert
> > haben. Wie kann ich das machen? Ich habe keine Möglichkeit gefunden,
> > $result umzusortieren.
>
> Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
> Ergebnis zu sortieren:
>
> SELECT *
> FROM (
> SELECT name, vorname
> FROM table
> ORDER BY RAND()
> LIMIT 5
> ) AS auswahl
> ORDER BY 1;

Das wäre eine Möglichkeit, die aber in meinen existierenden Skripten
nicht so einfach umzusetzen ist. Lieber würde ich wie gesagt das
Ergebnis eines vorherigen mysql_select umsortieren (sorry, aber mir
scheint der PHP-Schmodder in Bezug auf mein Problem nicht einfach
verzichtbar). Geht das auch irgendwie? Wenn nein, müsste ich eben sehr
viel in vorhandenen Skripten umbauen, was mir nicht so lieb wäre.

Grüße

Hans

Re: Umsortieren eines Query-Ergebnisses

am 01.07.2006 23:02:01 von ascii158

Hans Mayr wrote:
>> Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
>> Ergebnis zu sortieren:
>>
>> SELECT *
>> FROM (
>> SELECT name, vorname
>> FROM table
>> ORDER BY RAND()
>> LIMIT 5
>> ) AS auswahl
>> ORDER BY 1;
>
> Das wäre eine Möglichkeit, die aber in meinen existierenden Skripten
> nicht so einfach umzusetzen ist. Lieber würde ich wie gesagt das
> Ergebnis eines vorherigen mysql_select umsortieren (sorry, aber mir
> scheint der PHP-Schmodder in Bezug auf mein Problem nicht einfach
> verzichtbar). Geht das auch irgendwie? Wenn nein, müsste ich eben sehr
> viel in vorhandenen Skripten umbauen, was mir nicht so lieb wäre.

Wenn du das Statement da oben in deinen "PHP-Schmodder" an der Stelle
einsetzt, wo jetzt das alte Statement steht, dann hast bekommt das
Programm genau die gewünschte Lösung.

Oder suchst du eine Lösung, bei der du im Quelltext nichts ändern musst?
Ich fürchte, die wird es nicht geben.

Grüße,
--
Philipp Tölke
PGP 0x96A1FE7A

Re: Umsortieren eines Query-Ergebnisses

am 01.07.2006 23:20:12 von Kai Ruhnau

Hans Mayr wrote:
> Hallo Kai,
>
> Danke für die Antwort.
>>> $sql = "SELECT name, vorname FROM table ORDER BY REVERSE(RAND()) LIMIT
>>>> 5"
>>> $result = mysql_query($sql);
>> Wofür benutzt du REVERSE? Was erhoffst du dir davon, eine
>> String-Funktion auf eine Gleitkommazahl anzuwenden?
>
> Weil ich gelesen habe, dass Rand() allein nicht allzu "zufällig" ist
> und die Zufallsauswahl bei einer geringen Anzahl von Datensätzen der
> Grundmenge sehr häufig die gleichen Treffer bringt.
>
>>> Nun möchte ich diese fünf Einträge aber nach Nachnamen sortiert
>>> haben. Wie kann ich das machen? Ich habe keine Möglichkeit gefunden,
>>> $result umzusortieren.
>> Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
>> Ergebnis zu sortieren:
>>
>> SELECT *
>> FROM (
>> SELECT name, vorname
>> FROM table
>> ORDER BY RAND()
>> LIMIT 5
>> ) AS auswahl
>> ORDER BY 1;
>
> Das wäre eine Möglichkeit, die aber in meinen existierenden Skripten
> nicht so einfach umzusetzen ist. Lieber würde ich wie gesagt das
> Ergebnis eines vorherigen mysql_select umsortieren (sorry, aber mir
> scheint der PHP-Schmodder in Bezug auf mein Problem nicht einfach
> verzichtbar). Geht das auch irgendwie? Wenn nein, müsste ich eben sehr
> viel in vorhandenen Skripten umbauen, was mir nicht so lieb wäre.

Wenn du nichts an der Abfrage ändern möchtest / kannst, dann bist du
hier falsch.

X-Post und F'up2 de.comp.lang.php.datenbanken

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Umsortieren eines Query-Ergebnisses

am 01.07.2006 23:20:12 von Kai Ruhnau

Hans Mayr wrote:
> Hallo Kai,
>
> Danke für die Antwort.
>>> $sql = "SELECT name, vorname FROM table ORDER BY REVERSE(RAND()) LIMIT
>>>> 5"
>>> $result = mysql_query($sql);
>> Wofür benutzt du REVERSE? Was erhoffst du dir davon, eine
>> String-Funktion auf eine Gleitkommazahl anzuwenden?
>
> Weil ich gelesen habe, dass Rand() allein nicht allzu "zufällig" ist
> und die Zufallsauswahl bei einer geringen Anzahl von Datensätzen der
> Grundmenge sehr häufig die gleichen Treffer bringt.
>
>>> Nun möchte ich diese fünf Einträge aber nach Nachnamen sortiert
>>> haben. Wie kann ich das machen? Ich habe keine Möglichkeit gefunden,
>>> $result umzusortieren.
>> Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
>> Ergebnis zu sortieren:
>>
>> SELECT *
>> FROM (
>> SELECT name, vorname
>> FROM table
>> ORDER BY RAND()
>> LIMIT 5
>> ) AS auswahl
>> ORDER BY 1;
>
> Das wäre eine Möglichkeit, die aber in meinen existierenden Skripten
> nicht so einfach umzusetzen ist. Lieber würde ich wie gesagt das
> Ergebnis eines vorherigen mysql_select umsortieren (sorry, aber mir
> scheint der PHP-Schmodder in Bezug auf mein Problem nicht einfach
> verzichtbar). Geht das auch irgendwie? Wenn nein, müsste ich eben sehr
> viel in vorhandenen Skripten umbauen, was mir nicht so lieb wäre.

Wenn du nichts an der Abfrage ändern möchtest / kannst, dann bist du
hier falsch.

X-Post und F'up2 de.comp.lang.php.datenbanken

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Umsortieren eines Query-Ergebnisses

am 02.07.2006 09:21:46 von Hans Mayr

Hallo Kai!

Danke, Du hast Recht, das ist jetzt mehr ein php-Problem.

Also, wie kann ich das Ergebnis eines mysql_querry umsortieren?
Hintergrund: Ich habe ein kompliziertes Skript, das viele verschiedene
Fälle durchgeht, viele verschiedene query's macht, um mir am Ende mein
$result zu liefern (eigentlich auch in der richtigen Reihenfolge).
Jetzt möchte hieraus fünf Ergebnisse zufällig auswählen.

Erster, mysql-induduzierter Ansatz war es, mir das Ding in eine
Zufallsreihenfolge zu bringen, dann die ersten fünf zu nehmen und
wieder umzusortieren. Ist das vielleicht viel zu kompliziert gedacht?
Sollte ich vielleicht eher sehen, wieviele Ergebnisse es sind (n) und
mir dann fünf (verschiedene!) Zufallszahlen zwischen 0 und n-1
erzeugen und dann diese Ergebnisse ausgeben?

Ich bitte um Tipps von den Experten. Falls mein zweiter Ansatz besser
ist, hat jemand Code für solch eine Folge von Zufallszahlen, eine, die
so "zufällig" wie möglich ist? Die Zufallszahlen sollten dann
idealerweise aufsteigend sortiert sein.

Danke und Gruß

Hans

Re: Umsortieren eines Query-Ergebnisses

am 03.07.2006 13:09:02 von Thomas Rachel

Hans Mayr wrote:

>> Eine Variante wäre, dein SELECT als Subquery zu benutzen und dessen
>> Ergebnis zu sortieren:
>>
>> SELECT *
>> FROM (
>> SELECT name, vorname
>> FROM table
>> ORDER BY RAND()
>> LIMIT 5
>> ) AS auswahl
>> ORDER BY 1;
>
> Das wäre eine Möglichkeit, die aber in meinen existierenden Skripten
> nicht so einfach umzusetzen ist.

Sie hätte aber den Vorteil, daß sie die Result-Sets produziert, die zu den
alten kompatibel sind, so daß Du die Ansteuerung drumrum (mysql_query)
unangetastet lassen kannst. Was ist daran nicht einfach umzusetzen?

> Lieber würde ich wie gesagt das
> Ergebnis eines vorherigen mysql_select umsortieren (sorry, aber mir
> scheint der PHP-Schmodder in Bezug auf mein Problem nicht einfach
> verzichtbar).

Nichts anderes passiert da oben ja.


Was Du auch machen kannst: Sammele die Daten, um die es geht, in einer
temporären Tabelle, nimm Dir 5 beliebige Einträge raus und sortiere diese.

Zur Not auch mit Hilfe einer weiteren temporären Tabelle.


Thomas