Autor Zpráva
Qvido
Profil *
Zdravím,
potřebuji vybrat z DB tři náhodné řádky, ale každý musí být jiný.

Kvůli strukruře stránek nemohu použít ORDER BY RAND() LIMIT 3, ale musím použít třikrát ORDER BY RAND() LIMIT 1.

Problém je v tom, že se občas stane, že se zobrazí 2 stejné řádky (což je logické), ale já potřebuji pokaždé jiný řádek.

Nevíte náhodou prosím někdo jak to lze udělat, abych měl pokaždé jiný řádek?

Děkuji za vaše návrhy.
Kajman_
Profil *
A proměnné mezi jedlotlivými místy na stránce nemůžete přenášet?
Ax
Profil *
Pokud opravdu nemůžeš použít ORDER BY RAND() LIMIT 3, ale musíš použít třikrát ORDER BY RAND() LIMIT 1, přidej do druhého SQL dotazu něco jako WHERE id <> id_z_prvniho_dotazu a do třetího SQL dotazu něco jako WHERE id <> id_z_prvniho_dotazu AND id <> id_z_druheho_dotazu.
Joker
Profil
Qvido
Kvůli strukruře stránek nemohu použít ORDER BY RAND() LIMIT 3
Moc si neumím představit situaci, která by tomuhle zabránila. Ledaže by se mezitím vkládaly nové řádky a nové náhodné výběry by měly obsahovat i ty nové řádky.

Šlo by například si zapamatovat ID už vybraného záznamu a potom ho vyloučit
joe
Profil
Kvůli strukruře stránek nemohu použít ORDER BY RAND() LIMIT 3, ale musím použít třikrát ORDER BY RAND() LIMIT 1.
Můžeš to použít vždy, chce to jenom chtít :)
ninja
Profil
Kvůli strukruře stránek nemohu použít ORDER BY RAND() LIMIT 3, ale musím použít třikrát ORDER BY RAND() LIMIT 1.

Qvido: Povez nam prosim co je to za strukturu.
Qvido
Profil *
Joker
Šlo by například si zapamatovat ID už vybraného záznamu a potom ho vyloučit

No to mě napadlo taky, ale jak ho mám vyloučit? RAND(-$id) asi není to pravé ořechové, že? :-)

Ax
WHERE id <> id_z_prvniho_dotazu a do třetího SQL dotazu něco jako WHERE id <> id_z_prvniho_dotazu AND id <> id_z_druheho_dotazu.

To by mohlo být ono. Vyzkouším to. Děkuji.

Kajman_
A proměnné mezi jedlotlivými místy na stránce nemůžete přenášet?

Ano můžu, ale nevím jak bych to měl udělat abych měl v proměnných ty tři údaje.
Výpis dat mám takto:
$dotaz = mysql_query("SELECT * FROM jmena ORDER BY RAND() LIMIT 3");
while ($vypis = mysql_fetch_array($dotaz)) {
  $jmeno = $vypis["jmeno"];
}


Pokud vypíšu $jmeno ještě ve while, tak to funguje, ale pokud jej vypíši mimo while, tak se vypíše pouze poslední řádek (to je celkem logické) a ve while to vypisovat nemůžu, protože to ukládám do třech různých sloupečků (každý sloupec je originál).

ninja, joe a ostatní:
Nejde to, protože data z DB přiřazuji třem různým sloupečkům a každý má jinačí složení (id, class, table, ...)


Můžeš to použít vždy, chce to jenom chtít :)
Možná by to šlo, ale to bych musel zvládat css a upravit si stránky tak aby byly dle mých požadavků.
Kajman_
Profil *
$dotaz = mysql_query("SELECT * FROM jmena ORDER BY RAND() LIMIT 3");
$pole=array();
while ($vypis = mysql_fetch_array($dotaz)) {
  $pole[] = $vypis;
}
print_r($pole[0]);
print_r($pole[1]);
print_r($pole[2]);

Qvido
Profil *
Kajman_
Tak to jsem vůbec netušil, že je něco takového možné.

Děkuji Vám mnohokrát.
Joker
Profil
Qvido
Tak to jsem vůbec netušil, že je něco takového možné.
Pole jsou vcelku běžná součást programovacích jazyků.
Qvido
Profil *
Pole jsou vcelku běžná součást programovacích jazyků.
Ale to vím, jenomže jsem netušil, že to lze takto spojit s while.
Tomáš Fejfar
Profil *
Vzhledem k tomu, že toto vlákno je asi 2. na goolu při hledání způsobu na výpis náhodných řádků tabulky, tak si ho dovolím otevřít.

ORDER BY RAND() LIMIT 3
je zlo. Na tabulce s 10.000 řádků (větší eshop) se musí vygenerovat 10k náhodnch čísel a pak je ještě setřídit a to trvá. Lepší je mít rozsah ID (pravděpodobně od 1 do 10000 + z toho nějaké smazané). Vygenerovat např 30 náhodných čísel v PHP (abyste měli rezervu na ty smazané) a pak udělat
 SELECT .... WHERE id IN (123,321,456,654,789,987, ... ,11) LIMIT 3
. Vygenerovat 30 náhodných čísel trvá chvíli (v porovnání s 10k). A nemusí se to podle nich řadit.

Případně se dá ještě v PHP ošetřit pomocí
count($result)
extrémní případ, kdy trefíte více jak 28 smazaných ID.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0