Autor Zpráva
peta
Profil
Mam tabulku s reklamnimi banery
a chci z ni zobrazit treba 5 baneru tak,
aby se neopakovali
a poradi typu bych si mohl volit.
(type odpovida vlastne rozmerum a je spise pro dalsi ucely)

id, type, x, y, data
1, 1, 320,200, "..."
2, 2, 160,200, "..."
3, 1, 320,200, "..."
4, 1, 320,200, "..."
5, 3, 80,60, "..."
6, 1, 320,200, "..."

dotaz by mel byt nejak jako
vyber nahodne id, kde type=2,3,1,1,1 a id!= jiz vybranemu id
Jak takovy dotaz napsat?
Pripadne nejakou literaturu, kde se podobne dotazy pouzivaji a nemusi se prohledavat cela stranka jako dokumentace mysql.
Kajman_
Profil *
Náhodná data se občas řeší přes order by rand() ve spojení s limitem. Na velkých datech už to nemusí být použitelné.
peta
Profil
Kajman_
Ano, to vim, ze existuje neco jako RAND(). Ale, jak to spojit s tim, aby jsem mohl vybrat 5 konkretnich baneru s typ=neco a aby ID bylo jine nez jiz vybraneho.
Co teda ja vim, tak obvykle random funkce vrati nahodne cislo, ktere se ale muze objevit znovu pri dalsim volani random.
Cili predpokladam, kdyz dam RAND v dotazu, tak mi muze vybrat i retezec ID = 2,5,1,1,1 a to neni u zobrazovani reklamy zadouci mit 2 stejne.

http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html
peta
Profil
Takhle, ja o jednom reseni vim. Muzu zopakovat 5 dotazu a do kazdeho dat
id NOT IN (1)
id NOT IN (1,3)
id NOT IN (1,3,6)
Ale jsem si rikal, ze bych to udelal elegantneji jednom dotazem.
Tech reklam tam ma ten clovek asi 10. (nema smysl komentovat :) )
Kajman_
Profil *
pro 2,3,1,1,1 by to mohlo být tako nějak... nechápu, co v tom hledáte za složitosti
...where type=2 order by rand() limit 1)
union all
...where type=3 order by rand() limit 1)
union all
...where type=1 order by rand() limit 3)
peta
Profil
Kajman_ tak nevim, jestli by union fungoval.
mujhost.cz ma databazi jen 4.0.x a tam nejde ani SET NAMES

Mam toto, ze opakuji ty dotazy, ale asi to mam nejak spatne
//--- reklama ---
$rekl_type = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
$rekl_id = array();
$reklama = array();
for ($i=0;$i<count($rekl_type);$i++)
{
$reklama[$i]="";
$id = (count($rekl_id)>0) ? implode("','",$rekl_id) : "";
// $dotaz = "SELECT * FROM banners WHERE `type`='".$rekl_type[$i]."' AND `id` NOT IN ('$id') ORDER BY RAND() LIMIT 1";
//echo "<br/>$dotaz";
$dotaz = "SELECT * FROM banners WHERE `type`='".$rekl_type[$i]."' ORDER BY RAND() LIMIT 1";
$vysl = mysql_query($dotaz);// or die("<hr>Err: $dotaz<hr>".mysql_error());
$pocet = ($vysl>0) ? mysql_num_rows($vysl) : 0;
if ($pocet>0)
{
$row = mysql_fetch_array($vysl);
$rekl_id[$i] = $row['id'];
$reklama[$i] = "<iframe class="r$i" src="banner.php?id=".$row['id']."" width="".$row['w']."" height="".$row['h']."" frameborder="0" scrolling="no">Reklama$i</iframe> ";
}
}
peta
Profil
tak to asi funguje, jen musim nastavit pro zobrazovani baneru cash=no. Se mi to asi neobnovilo :)
nightfish
Profil
zobrazovani baneru cash=no
hotovost = ne?
Toto téma je uzamčeno. Odpověď nelze zaslat.