# mySQL random der letzten 5 einträge



## em3L (25. April 2007)

Moinsen liebe Tutorialer 
Also ich möchte gerne über mySQL die letzten 5 einträge zufällig ausgeben jedoch bekomm ich mit dem befehl RAND() immer nur den zufall der kompletten Tabelle :'(
Weis wer wie man dass lößen kann?

So dass wäre dann mal meine kurze, aber knackige Frage 
em3L


----------



## iMaTriX (25. April 2007)

Mahlzeit,

du musst den SQL begrenzen, dies schaffst du mit diesem Beispiel

```
FROM produkte WHERE id ORDER BY RAND() DESC LIMIT 5
```

versuch es hiermit
mfg


----------



## em3L (25. April 2007)

Hmm joa das ist glaub klar aber dann gibt er 5x einträge per zufall aus und nicht die "neuesten/letzten" 5 zufällige einträge!

Also z.B. ich habe 20 einträge nun will ich die neuesten 5 einträge immer zufällig pro seite aufrufen lassen aber die älteren 15 nicht!
Weis wer wie man dass realisieren kann?


----------



## d_b (26. April 2007)

hm, du könntest die letzten 5 Beiträge in ein Array schreiben und dann mit shuffle() "mischen". Ungefähr so:

```
$sql = "SELECT beitrag FROM tabelle ORDER BY beitrag DESC LIMIT = '5'";
$source = mysql_query($sql);
while ($result = mysql_fetch_array($source)) {
   $beitrag[] = $result['beitrag'];
}
shuffle($beitrag);
foreach ($beitrag as $i) {
   echo $i;
}
```


----------



## em3L (26. April 2007)

Hmm dass wäre eine gute Idee jedoch möchte ich nur einen Eintrag anzeigen lassen! Und zwar mehrere Daten aus der Tabelle die zusammengehören also die dazugehörige ID, Datum, Zeit etc. und dass von den letzten 5 im Random 

Hmm deine Idee war glaub ich schonmal ein ansatz aber wie mach man dass nun dass die verschiedenen Einträge alle "gleich" shuffled werden?


----------



## Radhad (26. April 2007)

Vielleicht das dann in eine Unterabfrage packen und dann bissl rumprobieren? Oder es auf der programm-seite entsprechend so erstellen, dass nur der 1. Eintrag angezeigt wird.


----------



## em3L (26. April 2007)

Radhad hat gesagt.:


> Vielleicht das dann in eine Unterabfrage packen und dann bissl rumprobieren? Oder es auf der programm-seite entsprechend so erstellen, dass nur der 1. Eintrag angezeigt wird.



Hmm Joa aber ich will ja die letzten 5  Und nicht einfach 1. Eintrag^^
Ich denke man könnte esmit arrays lößen nur wie dann also zufall bestimmen, dass alle angewälten arrays den gleichen zufallswert haben?


----------



## Radhad (27. April 2007)

Ich meinte ja schon die Abfrage mit ORDER BY feld DESC LIMIT 5  Dann hast du immer die neuesten 5 Einträge, die dann ins Array und durchmixen, dann den ersten Wert nehmen


----------



## d_b (27. April 2007)

hmm, habe einen (allerdings etwas aufwändigen) Lösungsweg gefunden. Es müsste bestimmt einfacher gehen, aber probier mal das:

```
$sql = "SELECT * FROM tabelle ORDER BY id DESC LIMIT = '5'";
$source = mysql_query($sql);
while ($result = mysql_fetch_array($source)) {
   $id[] = $result['id'];
   $beitrag[] = $result['beitrag'];
   $time[] = $result['time'];
}
$rand = rand(0, 4);
echo $id[$rand];
echo $beitrag[$rand];
echo $time[$rand];
```
Du schreibst die Daten in einzelne Arrays, die du mit $id[0] bis $id[4] aufrufen kannst. Dafür benutzt du rand();, um ein zufälliges auszugeben.
Hoffe es ist verständlich...
vG
David


----------



## Radhad (27. April 2007)

Das past fast, aber es muss ein zwei-dimensionales Array sein!


----------



## d_b (27. April 2007)

warum zwei-dimensional?


----------



## em3L (29. April 2007)

d_b hat gesagt.:


> hmm, habe einen (allerdings etwas aufwändigen) Lösungsweg gefunden. Es müsste bestimmt einfacher gehen, aber probier mal das:
> 
> ```
> $sql = "SELECT * FROM tabelle ORDER BY id DESC LIMIT = '5'";
> ...



Hmm das hätte bestimmt funktioniert wenn nicht bei dem erstem "[]" eintrag folgender Fehler auftritt: *Fatal error: [] operator not supported for strings in /home/u0016453269/public_html/docs/marc/rechts.php on line 192*
Was kann man da noch machen?


----------



## Flex (29. April 2007)

Die Fehlermeldung bedeutet, dass $id bereits vorher schon definiert wurde und zwar als String.


```
$sql = "SELECT * FROM tabelle ORDER BY id DESC LIMIT = '5'";
$source = mysql_query($sql);
unset($id);
$id = array();
while ($result = mysql_fetch_array($source)) {
   $id[] = $result['id'];
   $beitrag[] = $result['beitrag'];
   $time[] = $result['time'];
}
$rand = rand(0, 4);
echo $id[$rand];
echo $beitrag[$rand];
echo $time[$rand];
```

So sollte es funktionieren.


----------



## em3L (4. Juli 2007)

Hey Danke Felix Jacobi  Hat geholfen.

ps: Sorry dass ich solange nicht zurückgeschrieben hatte, aber musste Rechner formatieren etc.


----------



## Matthias Reitinger (4. Juli 2007)

Hallo,

ich schieb noch zwei (ungetestete) Alternativen hinterher:

```
<?php
$rand = rand(1, 5);
$sql = "SELECT * FROM tabelle ORDER BY id DESC LIMIT $rand";
$source = mysql_query($sql);
while ($row = mysql_fetch_assoc($source)) $result = $row;
print_r($result);
?>
```


```
<?php
$sql = "SELECT * FROM (
SELECT * FROM tabelle ORDER BY id DESC LIMIT 5) AS tmp
ORDER BY RAND() LIMIT 1";
$result = mysql_fetch_assoc(mysql_query($sql));
print_r($result);
?>
```

Grüße,
Matthias


----------

