Autor Zpráva
Prkny
Profil
Zdravím, lámu si hlavu nad dotazem z mysql databáze následujícího znění, poraďte:

vyber vše z tabulky jménem ABC 30 posledních záznamů a z těchto záznamů jich 9 náhodně zobraz

Jedná se o poddotaz mysql ale neumím jej použít v tomto případe, prosím o pomoc.
Děkuji.
Prkny
Profil
Zdravím, lámu si hlavu nad dotazem z mysql databáze následujícího znění, poraďte:

vyber vše z tabulky jménem ABC 30 posledních záznamů a z těchto záznamů jich 9 náhodně zobraz

Jedná se o poddotaz mysql ale neumím jej použít v tomto případe, prosím o pomoc.
Děkuji.
Kajman_
Profil *
select * from
(select * from abc order by id desc limit 30) t
order by rand() limit 9
Prkny
Profil
co znamená to "t" ve druhem radku na konci ?
nightfish
Profil
co znamená to "t" ve druhem radku na konci ?
to je alias (zkratka) pro tabulku vzniklou dotazem select * from abc order by id desc limit 30
Prkny
Profil
Bohužel mi to nejede hodí to následující hlášku :

SELECT * FROM (SELECT * FROM zbozi ORDER BY id DESC LIMIT 30) t ORDER BY RAND() LIMIT 9

MySQL hlásí: Dokumentace
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from zbozi order by id desc limit 30) t
order by RAND


Verze MySQL klienta: 5.0.18
Verze MySQL: 4.0.27
djlj
Profil
MySQL starší než 4.1 neumí vnořené dotazy a patří do musea.
Joker
Profil
Verze MySQL: 4.0.27
MySQL umí poddotazy až od verze 4.1.

Takže buď upgradovat databázi, nebo těch devět náhodných bude potřeba řešit až skriptem.
Prkny
Profil
mohli by jste mi dat inspiraci jak v php udelat tech 9 nahodnych selectů ?
Kajman_
Profil *
Všechny si dát do pole a pak
http://cz.php.net/manual/cs/function.array-rand.php
Prkny
Profil
kde je chyba ?

$dotaz = mysql_query("SELECT * FROM zbozi WHERE vyradit='' ORDER BY RAND() LIMIT 30");
srand ((double) microtime() * 10000000);
$rand_keys = array_rand($dotaz, 6);

while($radek=MySQL_Fetch_Array($rand_keys)){
echo "radek[id], radek[zbozi]";
}
Mastodont
Profil
vyradit=???
Joker
Profil
kde je chyba ?
Co to napíše?
Prkny
Profil
píše to chybu:
Warning: array_rand() [function.array-rand]: First argument has to be an array in /home/webhosting/sportovniobchod.cz/html/www/test.php on line 17

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/webhosting/sportovniobchod.cz/html/www/test.php on line 21

radek 17 je $rand_keys = array_rand($dotaz, 6);
radek 21 je while($radek=MySQL_Fetch_Array($rand_keys)){

mastodont: vyradit je filtr.... kdyz je prazdny zobraz....
nightfish
Profil
echo "radek[id], radek[zbozi]";
možná spíš echo $radek['id'].", ".$radek['zbozi'];

EDIT: no jinak do array_rand() musí jako první parametr přijít pole, ne odkaz na výsledek z mySQL
pakliže chceš vypsat výsledky náhodně seřazené, tak bude lepší array_srand() vynechat a do dotazu doplnit ORDER BY RAND()

EDIT2: jak vidím, tak ORDER BY RAND() tam máš... takže k čemu tam je to array_rand()?
Prkny
Profil
pravda dotaz by mel vypadat takto bez random... tedy vyber poslednich 30 zaznamu

$dotaz = mysql_query("SELECT * FROM zbozi WHERE vyradit='' ORDER BY id DESC LIMIT 30");


pak bych chtel docilit výběr 6 nahodných položek z onich 30 poslednich zaznamu.

mam tedy databázový dotaz uložit do pole ?
asi takto ?
$pole = MySQL_Fetch_Array($dotaz);

pak výběr náhodných šesti záznamů
$rand_keys = array_rand($pole, 6);

pak to zobratit pres while ?
while($radek=MySQL_Fetch_Array($rand_keys)){
echo "radek['id'], radek['zbozi']";
}

Ale nějak mi to nefunguje kde je chyba ? nehází to žádnou hlášku vypíše to smyčku jednoho záznamu stále do kola
Joker
Profil
Prkny
Už to vidím... $rand_keys = array_rand($dotaz, 6); - jak píše nightfish, té funkci se tady místo pole předává resource- výsledek SQL dotazu.

A naopak tady: while($radek=MySQL_Fetch_Array($rand_keys)){ - funkce mysql_fetch_array() očekává resource.

Správný postup při použití array_rand by byl zhruba takovýhle- schematicky:
1. Vyberu těch 30 prvků.
2. Jednotlivé položky si uložím do pole, např.: $pole=array(); while($i = mysql_fetch_array($vysledek_dotazu){array_push($pole,$i)}
(vznikne mi tedy pole polí)
3. Udělám $vybrane = array_rand($pole,9);
4. foreach($vybrane as $v) vypíšu $pole[$vybrane[$v]]
Kajman_
Profil *
Nebo když Vám dělá programování problémy, tak zkuste dva dotazy...

mysql_query("set hranice@=SELECT id FROM zbozi WHERE vyradit='' ORDER BY id DESC LIMIT 30, 1");
$dotaz = mysql_query("SELECT * FROM zbozi WHERE vyradit='' and id>ifnull(hranice,0) order by rand() limit 9");
Prkny
Profil
na ty dva dotazy mi to hodí tuto chybu
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/webhosting/sportovniobchod.cz/html/www/test.php on line 20

tedy u cyklu pro výpis pole: while($radek=MySQL_Fetch_Array($dotaz)){
Kajman_
Profil *
Jo, to se občas přihodí překlepy, když se to jen píše s hlavy, třeba to už bude lepší.

A když ne, tak vypište mysql_error.

mysql_query("SELECT @hranice:=id FROM zbozi WHERE vyradit='' ORDER BY id DESC LIMIT 30, 1");
$dotaz = mysql_query("SELECT * FROM zbozi WHERE vyradit='' and id>ifnull(@hranice,0) order by rand() limit 9");
Prkny
Profil
Pánové je to výborný, naprosto přesně to funguje jak jsem potřeboval.
Všem velice děkuji za diskusi, dozvěděl jsem se spousty nových informací.
Hlavní dík patří Kajmanovi_
Toto téma je uzamčeno. Odpověď nelze zaslat.

0