Autor | Zpráva | ||
---|---|---|---|
breeta Profil * |
#1 · Zasláno: 12. 8. 2008, 12:57:49
Dobrý den, potřebuji udělat nahodné foto s popisem pomocí databáze SQL pomůže mi někdo?
|
||
Kajman_ Profil * |
#2 · Zasláno: 12. 8. 2008, 12:59:41
zkuste
select * from fotky where id in (select id from fotky order by rand() limit 1) |
||
Alphard Profil |
#3 · Zasláno: 12. 8. 2008, 13:01:01
nacpat data do tabulky snad zvládneš a potom
select adresa, popis from fotky order by rand() limit 1 |
||
joe Profil |
#4 · Zasláno: 12. 8. 2008, 13:01:57 · Upravil/a: joe
Kajman_
Proč jste použil poddotaz? Je lepší (rychlejší) select * from fotky where id in (select id from fotky order by rand() limit 1) select * from fotky where id in (select id 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 |
#5 · Zasláno: 12. 8. 2008, 13:03:35 · Upravil/a: Alphard
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) 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 * |
#6 · Zasláno: 12. 8. 2008, 13:22:31
mam problem jak napsat zobrazení fotky z databaze
|
||
joe Profil |
#7 · Zasláno: 12. 8. 2008, 13:32:59
Alphard
:-)) breeta Jaký máš problém? |
||
breeta Profil * |
#8 · Zasláno: 12. 8. 2008, 13:55:00
ma zatim tohle:
1$pripojeni = mysql_connect("localhost", "root", "breta"); $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 * |
#9 · Zasláno: 12. 8. 2008, 13:56:37
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 |
#10 · Zasláno: 12. 8. 2008, 14:41:07
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 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) 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 |
#11 · Zasláno: 12. 8. 2008, 14:57:03 · Upravil/a: joe
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 |
#13 · Zasláno: 12. 8. 2008, 15:07:31
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 * |
#14 · Zasláno: 12. 8. 2008, 15:15:21
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 |
#16 · Zasláno: 12. 8. 2008, 22:00:25
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 |
#17 · Zasláno: 12. 8. 2008, 23:53:24
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 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: 1$spojeni = mysql_connect("localhost","root","heslo" ); $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"]. " <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"]. " <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"]. " <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"]. " <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 * |
#18 · Zasláno: 13. 8. 2008, 07:34:40
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 |
#19 · Zasláno: 13. 8. 2008, 20:33:10
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.
|
||
Časová prodleva: 3 dny
|
|||
breeta Profil * |
#20 · Zasláno: 16. 8. 2008, 10:55:23
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 1<?php <?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é. |
||
Časová prodleva: 17 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0