# Mysql + PHP] Datensätze zufällig ausgeben



## Moritz123 (30. Mai 2003)

Hallo!

gleich vorweg: ich habe die Suche benutzt aber keine Lösung meines Problemes gefunden.

der Sachverhalt:
ich will für meine kl Schwester einen Mathetrainer programmieren.
Dazu habe ich ein kleines PHP-Script geschrieben, dass die Aufgaben und Ergebnisse aus eine Datenbank holt und diese dann mit dem Eingebenen vergleicht und schließlich, sollte die Eingabe korrekt sein, ein entsprechendes Lob ausgibt und im Feld "done" eine 1 setzt, damit diese Aufgabe nicht mehr gestellt wird.
Datenbankstruktur:

```
id | katschluessel | katname | aufgabe | ergebnis | done
```
katschluessel = Kategorie im html-konformen Format
katname = Kategorie im "lesbaren" Format

das Problem:
zu Beginn wird eine Kategorie ausgewählt und dann soll:
1) eine Aufgabe aus der gewählten Kategorie ausgeben werden
2) diese Aufgabe aus dem Pool der in der DB eingetragenen Aufgaben zufällig ausgewählt werden

und genau bei der 2 ist das Problem: Da ich die ID durchgängig vergebe, kann ich mit rand() ja keine zufallszahl generieren, nach der ich den Datensatz auswähle.
Beispiel:
Datensätze:
1 | umrechnung | umrechnung von einheiten | 100g in kg | 0,1 | 0
2 | schriftdiv | Schriftl Dividieren | 185 : 5 | 37 | 0
3 | umrechnung | umrechnung von einheiten | 100kg in t | 0,1 | 0

gewählte Kategorie "umrechnung"

$anzahl = 3
$ausgabe = rand($anzahl)

$ausgabe ergibt dann durch zufall 2, das heißt ich erhalte den Datensatz mit der id 2.

Ich hoffe das Problem ist klar geworden...

Vielen Dank für die Hilfe!


----------



## yson (30. Mai 2003)

MySQL hat die Funktion RAND().

SELECT aufgabe FROM tabelle WHERE katschluessel = 1 ORDER BY RAND()

http://www.mysql.com/documentation/mysql/bychapter/manual_Reference.html#Functions


----------



## Moritz123 (30. Mai 2003)

Vielen Dank für die Antwort!
ich habe das jetzt so gemacht:

```
$abfrage = "SELECT * FROM mathetrainer WHERE katschluessel = '$_POST[katschluessel]' ORDER BY RAND() LIMIT 0,1";
```

Allerdings gibt er mir dann immer den selben Datensatz aus.


----------



## yson (30. Mai 2003)

hast du vielleicht nur einen Eintrag in der Kategorie?


----------



## Moritz123 (30. Mai 2003)

Nein, es sind 2 Einträge.
Könnte es an dem LIMIT liegen?


----------



## danube (30. Mai 2003)

```
$abfrage = "SELECT * FROM mathetrainer WHERE katschluessel = '$_POST[katschluessel]' && id='$ausgabe'";
```


----------



## Moritz123 (30. Mai 2003)

Sorry, aber was soll ich denn damit? Könntest Du mir das kurz erklären?


----------



## danube (30. Mai 2003)

oben hast du folgendermassen einen zufallswert ermittelt:
$anzahl = 3
$ausgabe = rand($anzahl)

wenn der zufallswert jetzt zb 2 ist gibt er den datensatz aus bei dem das feld id den wert 2 und das feld katschluessel die gewählte kategorie hat


----------



## Moritz123 (30. Mai 2003)

ja, aber das Feld mit der ID 2 hat nicht die gewünschte Kategorie.


----------



## danube (30. Mai 2003)

achso...

hast du denn die anzahl an einträgen für die gewählte kategorie?
wenn nicht zähl die einträge der kategorie mit mysql_num_rows(), ermittel dann eine zufallszahl mit dem mysql_num_rows ergebnis als höchsten wert und schreib dann folgendes:

$abfrage = "SELECT * FROM mathetrainer WHERE katschluessel = '$_POST[katschluessel]' LIMIT $zufallswert,1";


----------



## yson (30. Mai 2003)

Du hast Recht, ein einfaches RAND() bringt nicht viel.

So geht es etwas besser:
SELECT id, RAND() + RAND() FROM tabelle WHERE kat = 1 ORDER BY RAND()


----------



## Moritz123 (30. Mai 2003)

also jetzt blick ich ja gar nicht mehr durch...
bracuhe ich jetzt 2 abfragen?


----------



## danube (30. Mai 2003)

okay, hier meine master lösung, ansonsten probier mal das was yson geschrieben hat:

$result = mysql_query("SELECT id FROM mathetrainer where katschluessel='$_POST[katschluessel]'");
$anzahl=mysql_num_rows($result); 

$zufallswert = rand($anzahl);

$abfrage = "SELECT * FROM mathetrainer WHERE katschluessel = '$_POST[katschluessel]' LIMIT $zufallswert,1";


----------



## Moritz123 (30. Mai 2003)

Ich habs jetzt anders gemacht:

ich numeriere jetzt einfach innerhalb der Kategorien von 1 bis x - dann hat sich das problem erledigt. 
Vielen Dank aber trotzdem!


----------



## Nana-chan (17. Juni 2008)

Ich arbeite zur Zeit an einem Trading Card Game, bei dem die User wenn sie sich anmelden 4 zufällig ausgewählte Karten als "Startkapital" bekommen.
Die zufällige Abfrage der Karten funktioniert auch einwandfrei, allerdings fände ich es gut, wenn man irgendwie sicher stellen könnte, dass nicht zwei Karten aus den gleichen Sets ausgewählt werden.
Ist das möglich?

Aufbau der Datenbank

```
id | set | nummer
```

Auslesen aus der Datenbank

```
$sql = 'SELECT name,nummer FROM cards ORDER BY rand() LIMIT 0,4';
```


----------



## Dark Ranger (17. Juni 2008)

Ich hätte da noch einen Vorschlag


```
$query = "SELECT * FROM mathetrainer WHERE id=(SELECT id FROM mathetrainer WHERE katschluessel = '".$_POST[katschluessel]."' ORDER BY RAND() LIMIT 1)";
```

Nicht getestet müsste aber funktionieren


----------

