Avatar billede christian-s Nybegynder
17. marts 2003 - 21:51 Der er 28 kommentarer og
2 løsninger

Tilfældigt udtræk fra db, ikke samme to gange

Jeg skal hente et tilfældigt udtræk fra en tabel i MySQL.
Den må ikke hente samme udtræk to gange i træk.
Avatar billede schaefner Juniormester
17. marts 2003 - 21:59 #1
Er det kun en post du hiver ud eller er det flere?
Avatar billede christian-s Nybegynder
17. marts 2003 - 22:01 #2
Ja, én række med flere felter
Avatar billede christian-s Nybegynder
17. marts 2003 - 22:02 #3
f.eks. et tilfældigt id
Avatar billede schaefner Juniormester
17. marts 2003 - 22:03 #4
Du burde kunne lave noget ala:

<?
session_start();
mysql_connect("localhost","","");
mysql_select_db("");
$query = mysql_query("SELECT * FROM tabel WHERE overskrift !='$_SESSION[seen]' ORDER BY RAND() LIMIT 0,1");
$row = mysql_fetch_array($query);
    $_SESSION['seen']  = $row[overskrift];
}
?>
<html>
<head></head>

<body>

<?php
echo "$row[overskrift]<br>";
echo "$row[tekst]";
?>

</body>
</html>
Avatar billede schaefner Juniormester
17. marts 2003 - 22:03 #5
skal rettes til med navne og sådan :)

og jeg opdagede også en lille fejl:

<?
session_start();
mysql_connect("localhost","","");
mysql_select_db("");
$query = mysql_query("SELECT * FROM tabel WHERE overskrift !='$_SESSION[seen]' ORDER BY RAND() LIMIT 0,1");
$row = mysql_fetch_array($query);
$_SESSION['seen']  = $row[overskrift];
?>
<html>
<head></head>

<body>

<?php
echo "$row[overskrift]<br>";
echo "$row[tekst]";
?>

</body>
</html>
Avatar billede erikjacobsen Ekspert
17. marts 2003 - 22:07 #6
Den kan je sagtens give den samme to gange i træk.

Hvad med at tage dem i rækkefølge, evt. med et tilfældigt
tal som start?
Avatar billede xyborx Nybegynder
17. marts 2003 - 22:40 #7
Hvad med noget i retning af:

$array=mysql_fetch_array(mysql_query("SELECT * FROM tabel ORDER BY seen DESC LIMIT 1"));
mysql_query("UPDATE tabel SET seen=seen+1 WHERE id=$array[id]");

Har ikke testet, men den burde ikke kunne vise den samme post to gange i træk. (det er muligt at der ikke skal stå DESC i første query. Test, og se om den virker ;)
Avatar billede erikjacobsen Ekspert
17. marts 2003 - 22:45 #8
Det kan den jo godt, hvis der er flere der ser siden samtidigt,
Avatar billede xyborx Nybegynder
17. marts 2003 - 23:09 #9
Det ville kræve at der højst er nogle få millisekunder imellem dem.. Men jo, teoretisk set kan det godt lade sig gøre at den viser det samme to gange i træk. Sandsynligheden er bare så lille, at jeg ikke ville betragte det som et problem.
Avatar billede erikjacobsen Ekspert
18. marts 2003 - 06:48 #10
Nej, det er ikke de millisekunder det drejer sig om, som du
tænker på. Spørgeren har vist nok en side hvor der med kort
mellemrum vises et tilfældigt billede, og det ser dumt ud
hvis der vises det samme billede 2 gange i træk.

Sidder der tilpas mange mennesker og ser på siden, vil en
bruger kunne opleve at de andre brugere har fået talt din
tæller op, så det samme billede dukker op igen.
Avatar billede xyborx Nybegynder
18. marts 2003 - 09:30 #11
Ahaa.. På den måde.. :o) Ja, så kan jeg godt se det usmarte i mit forslag..
*tænker videre...*
Avatar billede christian-s Nybegynder
18. marts 2003 - 14:08 #12
Jeg  benytter denne, men jeg synes ikke den er "tilfældig nok":
$result = mysql_query("SELECT * FROM tabel ORDER BY RAND() LIMIT 0,1");
Avatar billede erikjacobsen Ekspert
18. marts 2003 - 14:13 #13
Hvad siger du til mit forslag "Hvad med at tage dem i rækkefølge, evt. med et
tilfældigt tal som start?". Der er vel ingen der siger, at det absolut
skal være tilfældigt.

Er du med på ideen finder vi nok ud af at lave det også.
Avatar billede christian-s Nybegynder
18. marts 2003 - 14:19 #14
jo, det lyder fornuftigt. men, der kan jo være huller i id-rækken.
hvordan vil du indlæse dem?
Avatar billede erikjacobsen Ekspert
18. marts 2003 - 14:25 #15
Ja, men det er ligemeget. Brug fx forslaget med sessions du fik her,
til at huske hvilket id, der blev vist sidst. Så laver du
blot en
  $gammelid=....;
  $sql="select ... from ... where id>$gammelid order by id asc limit 1";
Hvis der ikke er nogen skal du lave en ny select fra starten, for at få
den første
  $sql="select ... from ... where by id asc limit 1";
Den nye id gemmer du i din sessionvariabel.

Er der ingen værdi i din sessionvariabel, skal du bruge den sætning du
allerede har, til at få startet et nogenlunde tilfældigt sted i rækken.
Her skal du også gemme id i din sessionvariabel.
Avatar billede erikjacobsen Ekspert
18. marts 2003 - 14:26 #16
Skulle nok:
$sql="select ... from ... order by id asc limit 1";
Avatar billede christian-s Nybegynder
22. marts 2003 - 11:45 #17
Erik, jeg har problemer med at få placeret min session - vil du ikke prøve at indbygge det kort i dit forslag ovenfor?
Avatar billede erikjacobsen Ekspert
22. marts 2003 - 12:26 #18
Vis noget kode, så kan jeg måske rette det til.
Avatar billede christian-s Nybegynder
22. marts 2003 - 12:35 #19
Jeg kan ikke overskue hvordan sessiondelene skal placeres:

<?php

$gammel_id = $_SESSION['seen'];

?>

<?php

session_start();

mysql_connect...

if ($gammel_id) {
$result = mysql_query("SELECT * FROM bogforsider WHERE bog_id>$gammel_id ORDER BY id ASC LIMIT 1");
}

else {
$result = mysql_query("SELECT * FROM bogforsider ORDER BY id ASC LIMIT 1");
}

$row = mysql_fetch_array($result);

        $bog_id            = $row["bog_id"];

$_SESSION['seen'] = $bog_id;

echo "$bog_id...";

?>
Avatar billede erikjacobsen Ekspert
22. marts 2003 - 12:41 #20
Nummer 2 select foreslår jeg skal være random, så man ikke
starter samme sted hver gang. Du skal også i den første
select teste for om du får 0 tupler tilbage, for så skal du
starte forfra.

Skal session_start() ikke altid står først?
Avatar billede christian-s Nybegynder
03. april 2003 - 13:12 #21
Undskyld jeg ikke har fået kommet videre, den kommer med en fejl om, at header allerede er sendt i den linie hvor $session_start(); står.
Er det fordi jeg har en include øverst?

Derudover kommer der fejl i connect til MySQL serveren, er det fordi der kommer problemer med session og include?
Avatar billede christian-s Nybegynder
03. april 2003 - 13:13 #22
Undskyld, der er ikke fejl i connect'en, kun i headeren!
Avatar billede schaefner Juniormester
03. april 2003 - 13:15 #23
For det første skal det ikke hedder $session_start();. For det andet så kan de godt være din include, hvis der f.eks. er mellem i filen eller hvis du laver en echo :)
Avatar billede christian-s Nybegynder
03. april 2003 - 13:15 #24
Jeg forvirrer vist mig selv med localhost og på nettet, jeg ved ikke hvordan, men selvom jeg bruger den samme include og connect påstår den, at den ikke kan connecte til local MySQL server.

Jeg bruger præcis din opbygning ovenfor!
Avatar billede christian-s Nybegynder
03. april 2003 - 13:17 #25
Undskyld jeg mener session_start();
Min include(); står øverst og resten af scriptet kommer nedenunder..
Avatar billede christian-s Nybegynder
03. april 2003 - 13:19 #26
Det er disse fejl det drejer sig om:

Warning: Cannot send session cookie - headers already sent by +
Warning: Cannot send session cache limiter - headers already sent

De henviser begge til linien:
session_start();
Avatar billede _darkstar_ Nybegynder
03. april 2003 - 13:28 #27
Der står meget eksplicit i Mysqls manual at løsningen med

mysql_query("SELECT * FROM tabel ORDER BY RAND() LIMIT 0,1");

er en rigtig dårlig idé, som fører til dårlig performance. Se mit løsningsforslag på http://www.eksperten.dk/spm/334429
Avatar billede christian-s Nybegynder
03. april 2003 - 13:37 #28
Jeg forstår ikke så meget ASP, kunne du oversætte en streng query til PHP?
Avatar billede _darkstar_ Nybegynder
03. april 2003 - 16:43 #29
Æh, ja. Du skal bare skifte "&" ud med "." - så burde det virke.
Avatar billede christian-s Nybegynder
17. juni 2003 - 16:12 #30
undskyld forsinkelsen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester