Autor Zpráva
breeta
Profil *
Dobrý den, potřebuji udělat nahodné foto s popisem pomocí databáze SQL pomůže mi někdo?
Kajman_
Profil *
zkuste

select * from fotky where id in (select id from fotky order by rand() limit 1)
Alphard
Profil
nacpat data do tabulky snad zvládneš a potom
select adresa, popis from fotky order by rand() limit 1
joe
Profil
Kajman_
Proč jste použil poddotaz?
Je lepší (rychlejší)
select * from fotky where id in (select id from fotky order by rand() limit 1)
než
select * from fotky order by rand() limit 1
?
Já si všiml v rámci testování, že při více řádků v tabulce je rand() celkem pomalý, ale že by to zrychlil poddotaz, kde se vybírá jen id?
Alphard
Profil
Kajman_
mohu mít otázku? v čem je lepší vložený dotaz?

select * from fotky where id in (select id from fotky order by rand() limit 1)
a
select adresa, popis from fotky order by rand() limit 1

dělá podle mě to samé (kromě výběru sloupců)


// joe, to snad ne :-)
breeta
Profil *
mam problem jak napsat zobrazení fotky z databaze
joe
Profil
Alphard
:-))

breeta
Jaký máš problém?
breeta
Profil *
ma zatim tohle:


$pripojeni = mysql_connect("localhost", "root", "breta");
mysql_select_db("mojedata");
if ($pripojeni == FALSE) {
	echo "nepripojeno";
	exit();
	}


$tabulka = "SELECT * FROM reference order by rand()limit 1";
$vysledek = mysql_query($tabulka);
while ($radek = mysql_fetch_array ($vysledek,MYSQL_ASSOC)) {
$id = $radek['id'];
$popis = $radek['popis'];
$foto = $radek['foto'];
echo "$id, $popis, $foto";
}


zapis pro zobrazeni fotky musí jak?
Kajman_
Profil *
joe a Alphard

Myslím, že tohle řešení jsem viděl v manuálu, že by mělo být rychlejší. Nezkoušel jsem ho, ale tipnul bych, že u toho vnořeného může číst jen index na získání náhodného id a pak si jen šáhne do tabulky pro ono id. Nemusí tedy číst celou tabulku.
Alphard
Profil
breeta
while ($radek = mysql_fetch_array ($vysledek,MYSQL_ASSOC)) {
můžete použít rovnou funkci mysql_fetch_assoc() a ten cyklus také není nutný, vzhledem k tomu limit 1, možnost ošetření prázdné tabulky nepředpokládám
zapis pro zobrazeni fotky musí jak?
jsou fotky uložené v databázi, nebo v adresáři a v databázi jsou jen cesty?

Kajman_
dík, já jsem v rychlosti našel jen tohle

If you are selecting a wide result set and using ORDER BY RAND() with a LIMIT, you can often speed things up by changing a query of the form:
SELECT id, col1, col2, ... , colN FROM tab WHERE conditions ORDER BY RAND() LIMIT m

To a query of the form:
SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m)

Although the second query has to perform an additional select, it only has to sort a result set containing the single id column, rather than the full result set you are returning from the query.
7.2.12. ORDER BY Optimization (zhruba ve 3. třetině stránky)

nevím, co je myšleno tím wide result, tady bych to osobně neviděl nijak drasticky, tak jsem se zeptal, možná máte jiné zdroje
joe
Profil
Díky.

Alphard
Wide result set - tím je myšleno, pokud vybíráš hodně sloupců, tak je lepší to použít s tím pod dotazem, protože ten je rychleji setřízen, než celý výsledek se všemi sloupci.
Kajman_
Profil *
Jo, to je asi to místo, kde jsem to kdysi zahlédl.

Zkusil jsem to na tabulce, co má lehce přes milion záznamů, a rozdíl tam je...
select * from protokoly_data_pol p order by rand() limit 10
--15 s
select p.* from protokoly_data_pol p, (select p2.vid, p2.pol_id from protokoly_data_pol p2 order by rand() limit 10) p3 where p.vid=p3.vid and p.pol_id=p3.pol_id;
--1.5 s

Podle explain, druhý opravdu použije primární index a řadí hodnoty z něho.
joe
Profil
Kajman_
Nevím jak je řešeno to order by rand, ale nechápu co na tom trvá tak dlouho.

Přece kdyby napřed provedl něco jako count(*), to by byla maximální hodnota pro náhodné číslo, pak z ní nějaké vybral a pak podle toho vybral řádek, bylo by to přece hned :)
Kajman_
Profil *
joe
ale nechápu co na tom trvá tak dlouho
Pro každý řádek vygeneruje náhodné číslo a podle něho to seřadí. Hledají se tedy řádky, které mají nejmenší náhodně vygenerované číslo, proto to trvá.

maximální hodnota pro náhodné číslo, pak z ní nějaké vybral a pak podle toho vybral řádek
Jo, to by bylo hned, ale pokud tam budou v id mezery, tak se nebude vybírat rovnoměrně. Musela by se udělat mezitabulka viz. článek odkazovaný z komentáře v tom manuálu...
http://jan.kneschke.de/projects/mysql/order-by-rand/
Kajman_
Profil *
A pokud se bude vybírat pouze jedna fotka, tak rychle a jednoduše by to mohlo jít přes dva dotazy...

select floor(count(*)*rand()) preskoc from fotky
a pak
select * from fotky limit $preskoc, 1
joe
Profil
Kajman_
To mě pak taky napadlo, co kdyby nějaké id nebyly, ale i to by se dalo řešit například tím, že by se vzalo náhodné číslo a vybral by se řádek, který má větší id než to náhodné číslo, rovnoměrné by to asi nebylo v případě, že nějaké ty id budou chybět, ale svůj účel by to splňovalo :-) samozřejmě že jsou i situace, kdy by tento způsob nemusel projít..
kukweb
Profil
Neco podobneho jsem udelal z galerky coppermine.

http://irsko.kukweb.info/vtipy/vtip.php

bohuzel, cas od casu mne to hodi chybu:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/www/kukweb.info/subdomains/irsko/vtipy/vtip.php on line 42


Napsal jsem to takto:

$spojeni = mysql_connect("localhost","root","heslo" );
mysql_select_db("irskof_kukweb_info", $spojeni);

$vtip = mysql_query( "SELECT * FROM cpg14x_pictures", 
$spojeni) or Die ('nevybral jsem z databaze vtip'); // vybereme tabulku vtipy

$pocet_vtipu= @MySQL_Num_Rows($vtip)  or Die ('nevim kolik je vtipu'); // zjistime kolik mame celkem vtipu



$nahodny_vtip = rand (2, $pocet_vtipu - 1) or Die ('nahodny vyber selhal'); // vybereme nahodne vtip od 0 az po pocet vtipu bez 1. nula je jakoze prvni vtip
$nahodny_vtip2 = rand (2, $pocet_vtipu - 1) or Die ('nahodny vyber selhal');



$vysledek = mysql_query( 
"SELECT * FROM cpg14x_pictures WHERE pid = $nahodny_vtip ", 
$spojeni); // vybereme z tabulky vtip s id jako nam hodila funkce random


while ($zaznam = mysql_fetch_array($vysledek) ): 
echo "<font >Nahodny obrazek z Gallerye </font><br>";
echo "obr. cislo (";
echo $nahodny_vtip;
echo ",";
echo $nahodny_vtip2;
echo ")<br>";
echo "<table border=2 cellpadding=0 cellspacing=0 bordercolor=#FFFFFF   >
<tr ><td><img src=http://irsko.kukweb.info/foto/albums/".$zaznam["filepath"], $zaznam["filename"]."  width=237px height=178px border=1  ><br>
<font >pridal:</font>" .$zaznam["owner_name"]. "&nbsp; <font >zobrazeni:</font>" .$zaznam["hits"]."<br>

";
$aid = $zaznam["aid"];
endwhile;

$album = mysql_query( 
"SELECT * FROM cpg14x_albums WHERE aid = $aid ", 
$spojeni); // vybereme z tabulky vtip s id jako nam hodila funkce random
while ($az = mysql_fetch_array($album) ): 
echo "<font >album:<a href=http://irsko.kukweb.info/foto/thumbnails.php?album=".$az["aid"]. " target=_blank> ".$az["title"]. "&nbsp; <img src=http://irsko.kukweb.info//vtipy/click.gif width=24 height=15></a></font></td>";
endwhile;

$vysledek = mysql_query( 
"SELECT * FROM cpg14x_pictures WHERE pid = $nahodny_vtip2 ", 
$spojeni); // vybereme z tabulky vtip s id jako nam hodila funkce random


while ($zaznam = mysql_fetch_array($vysledek) ): 
echo "
<td><img src=http://irsko.kukweb.info/foto/albums/".$zaznam["filepath"], $zaznam["filename"]."  width=237px height=178px border=1  ><br>
<font >pridal:</font>" .$zaznam["owner_name"]. "&nbsp; <font >zobrazeni:</font>" .$zaznam["hits"]."<br>



";


// vypiseme vtip a je to:-)
$aid = $zaznam["aid"];
endwhile;
$album = mysql_query( 
"SELECT * FROM cpg14x_albums WHERE aid = $aid ", 
$spojeni); // vybereme z tabulky vtip s id jako nam hodila funkce random
while ($az = mysql_fetch_array($album) ): 
echo "<font >album:<a href=http://irsko.kukweb.info/foto/thumbnails.php?album=".$az["aid"]. " target=_blank> ".$az["title"]. "&nbsp; <img src=http://irsko.kukweb.info//vtipy/click.gif width=24 height=15></a></font></td></tr></table>";
endwhile;


Nepomohl by mne nekdo najit chybu :( diky
Kajman_
Profil *
kukweb
Nepomohl by mne nekdo najit chybu
Chybu pomůže najít mysql_error.

$vysledek = mysql_query($q="SELECT * FROM cpg14x_pictures WHERE pid = '$nahodny_vtip'", $spojeni) or die("Došlo k chybě v dotazu: ".$q."<br>".mysql_error());
kukweb
Profil
uz jsem na to prisel, podle mne je odpoved prazdna. Takze se vse pak zhrouti. Asi udelam neco prez IF $neco <> "" OR "0" ....... obrazek nenalezen.
breeta
Profil *
Zdarec nakonec jsem to udělal takhle:


Vytvořil jsem tabulku:
id - klíč pro náhodný výběr
popis - popis foto
soubor - nazev souboru např.: pepa.jpg
alt - popis html

<?php

$pripojeni = mysql_connect("localhost", "root", "heslo");
mysql_select_db("databaze");
if ($pripojeni == FALSE) {
	echo "nepřipojeno";
	exit();
	}
	
$tabulka = "SELECT * FROM reference order by rand()limit 1";
$vysledek = mysql_query($tabulka);
while ($radek = mysql_fetch_assoc ($vysledek)) {
$popis = $radek['popis'];
$soubor = $radek['soubor'];
$alt = $radek['alt'];

}
echo "$popis"
?>
<img src="slozkasfoto/<?php echo "$soubor" ?>" alt="<?php echo "$alt" ?>" />


v PHP a SQL začínám původně jsem chtěl uložit fotky do databáze ale všude píšou že to není to pravé.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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